and welcome to the Chicken community! Your project looks very thourogh and the Scheme code looks good.
There are a couple of issues related to building that I thought I'd point out.
Like Felix points out, load and load-relative open files at runtime. So sdb fails when run outside of its repo directory because of these:
~> ~/opt/simple_db/sdb
Error: (load) cannot open file: "./db-utils.scm"
====
> ~/opt/simple_db/sdb -h
Error: (open-input-file) cannot open file - No such file or directory: "./cli-interface.txt"
In Scheme, the ordinary string syntax can have multiple lines. So if you wanted to, you could wrap the content of cli-interface.txt in double-qoutes and embed it directly into your sources. That'll eliminate these kinds of runtime issues. You could also use include or read cli-interface.txt at compile time using define-syntax or let-syntax.
====
There are also egg dependencies in use which don't seem to be mentioned anywhere. Without these, I get this error message.
> ./sdb -h
Error: (import) during expansion of (import ...) - cannot import from undefined module: list-utils.basic
I'm guessing I need to install list-utils, but that olso fails because of transitive dependencies. So I need to run `chicken-install check-errors`, then `chicken-install list-utils`. Then another `chicken-install gnuplot-pipe`.
Manual dependency management like quickly gets out of hand. You can use egg-files, which you've probably come across. Here's a bare minimum to get dependencies and transitive dependencies installed:
~/o/simple_db (main)> cat sdb.egg
((dependencies list-utils gnuplot-pipe))
~/o/simple_db (main)> chicken-install
...
building gnuplot-pipe
installing gnuplot-pipe
building sdb
installing sdb
chicken-install runs for the current directory if nothing is specified, so it picks up sdb.egg. I often use egg files even for small toy project that I don't tend to release because of this, amongst other things. You can also use egg files to install programs like sdb if you wish.
If you run chicken-install with -test, it'll run test/run.scm, where you can put your unit tests. This is all chicken-specific stuff, other Schemes do it their way. A Makefile like you have is a pretty global mechanism so it has its advantages.
===
I hope none of this is discouraging! Looking forward to seeing what else you produce.
Hoppy holidays,
K.