我在 Lisp 中“看到”宏的方式如下:每当我看到宏调用
(mymacro arg1 arg2 ... argn)
时,我认为它与 (eval (myfun (quote arg1) (quote arg2) ... (quote argn)))
相同,其中 myfun 是一个函数,其主体与 完全相同相同mymacro 的主体。我认为这是理解宏的一种过于简单化的方式。但我很难找到失败的例子。
那么,是否有 s 表达式 BODY 和 ARG 的示例,使得给出以下
mymacro
和 myfun
的定义,
(defmacro mymacro (param) BODY)
(defun myfun (param) BODY)
表达方式
(mymacro ARG)
和 (eval (myfun (quote ARG)))
不评估出相同的结果吗?
PS:我只使用一个参数,所以写这个问题更容易,但我显然对具有多个参数的示例没意见。
PS:我对最后的语义差异更感兴趣,而不是实现细节、性能差异等。
如果扩展引用局部变量,情况会有所不同,因为
eval
在全局环境中计算表达式。
这是一个宏,它是标准
INCF
宏的简化版本。
(defun increment-func (variable)
`(setq ,variable (1+ ,variable)))
(defmacro increment (variable)
(increment-func variable))
(let ((foo 1))
(increment foo)
(print foo))
(let ((foo 1))
(eval (increment-func 'foo)))
第一次使用会工作并打印
2
,第二次使用会抱怨 FOO
未绑定。