Хотя это не совсем та проблема, с которой вы сталкиваетесь, но, кроме того, основываясь на вашем вопросе о последовательности оценки аргументов, let
также является «синтаксическим сахаром» для лямбды, за которой следуют ее аргументы, которые сначала оцениваются, а затемпередается в лямбду, которая затем оценивается.
Например:
(let ((a (list 1 2 3))
(b (list 4 5 6)))
(cons a b))
- это то же самое, что и
((lambda (list-a list-b) (cons list-a list-b)) (list 1 2 3) (list 4 5 6))
Итак, если вам интересноПоследовательность оценки, аргументы полностью оцениваются перед вычислением тела (и один аргумент не может ссылаться на предшествующий ему аргумент ... используйте let*
для чего-то, что требует таких привязок).