Я пытаюсь написать макрос на Лиспе, который заново реализует let
, используя себя.Это тривиальное упражнение, которое не имеет практической цели;однако после ответа на связанный вопрос я понял, что, вероятно, мне следует больше узнать о макросах.Они рекламируются как одна из замечательных вещей в Лиспе, но я редко их использую.
В любом случае, вот что я попробовал сначала:
(defmacro mylet (args &rest exp) `(let ,args (dolist (x ,exp) x)))
но когда я пытаюсь что-то вроде:
(mylet ((a 5) (b 2)) (print (+ a b)))
это выдает ошибку:
#1=(PRINT (+ A B)) is not a symbol or lambda expression in the form (#1#) .
аргументы (a и b) установлены правильно, но оператор print не работает.Я думаю, это потому, что я использую два уровня косвенности - ссылаясь на переменную, которую я создал в макросе.Но я не могу понять, как это исправить!Есть идеи?