chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Advises and feedback


From: Kristian Lein-Mathisen
Subject: Re: Advises and feedback
Date: Sun, 24 Mar 2024 08:53:14 +0100


Hi Miguel,

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:

> make
> ./sdb -h
> cd ~
~> ~/opt/simple_db/sdb
Error: (load) cannot open file: "./db-utils.scm"

====

In the same manner, the help-file is opened and read at runtime here: https://github.com/MigAP/simple_db/blob/main/cli.scm#L31. This results in a similar problem when sdb is used outside its repo directory:

> ~/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.


On Fri, Mar 22, 2024, 19:54 <felix.winkelmann@bevuta.com> wrote:
> Hello everyone!
>
> My name is Miguel, and I am interested in developing in Chicken Scheme.
>
> I just created a toy project to put in practice what I have been
> learning in the Little Schemer and SICP books, you can find it here:
>
> https://github.com/MigAP/simple_db
>
> It is a simple database to store urls. I am not a developer, so I would
> appreciate any feedback from you. In particular, it is the first time I
> write unit tests, and I am not sure if this is the correct way of doing-it.
>
> I thank you in advance for any feedback. I am looking forward to start
> building stuff using Chicken Scheme!
>
> I wish you all a good day.

Hi!

Your code looks good to me. I haven't examined it in detail, but
the overall impression is fine. Also, the unit-tests seem to be similar
to what I've seen in other code by more experienced Schemers.

Note that you compile your program but load additional files via
"load-relative". This technically works, but if you want all code to
be compiled, I recommend to use "include" instead: that way,
the parts are inserted into your main program and fully compiled,
which is of course more efficient and also makes it easier to
move the compiled program around or call it from a different
location.

> PS: Is there any small/medium project that I could study to learn the
> "good practices" for Chicken Scheme? One of my goals is to use Chicken
> Scheme for scientific computing and embedded applications.

The egg sources are usually good examples for how to structure
libraries. Some of these have example programs that you might
want to study. Also, you can look at

        http://wiki.call-cc.org/Software

which lists a couple of larger projects that use CHICKEN.


cheers,
felix



reply via email to

[Prev in Thread] Current Thread [Next in Thread]