While not exactly the problem you’re experiencing, but an aside based on your questioning about the sequence of evaluating the arguments, let
is also “syntactic sugar” for a lambda followed by it’s arguments that are first evaluated and then passed to the lambda which is then evaluated.
For instance:
(let ((a (list 1 2 3)) (b (list 4 5 6))) (cons a b))
is the same as:
((lambda (list-a list-b) (cons list-a list-b)) (list 1 2 3) (list 4 5 6))
So, if you’re ever wondering about evaluation sequence, the arguments are evaluated fully before the body is evaluated (and one argument cannot refer to an argument preceding it … use let*
for something that requires bindings like that).