let
我正在尝试在 Lisp 中编写一个使用自身重新实现的宏。这是一个没有实际目的的琐碎练习;然而,在回答了一个相关问题之后,我意识到我应该更多地了解宏。它们被吹捧为 Lisp 的一大优点,但我很少使用它们。
无论如何,这是我首先尝试的:
(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#) .
args(a 和 b)设置正确,但 print 语句不起作用。我认为这是因为我使用了两个间接级别——指的是我在宏中创建的变量。但我似乎无法弄清楚如何解决它!有任何想法吗?