我很难理解宏扩展是如何运作的。 elisp解释器如何处理这两段代码有什么不同?
(defmacro foo (arg)
(message "arg is: %s" arg))
(foo "bar")
和
(defmacro foo (arg)
`(message "arg is: %s" ,arg))
(foo "bar")
答案 0 :(得分:7)
message
显示消息,返回消息。(defconst zzz 123)
(defmacro zzz1 (arg)
`(insert (format "arg is: %s" ,arg)))
(defmacro zzz2 (arg)
(insert (format "arg is: %s" arg)))
在3个表格中的每个表格之后使用 C-x C-e 评估上面的代码。
现在评估这些:
(zzz1 zzz)
翻译......
zzz1
(insert (format "arg is: %s" zzz))
"arg is: 123"
插入当前缓冲区,并返回nil
(在底部的回显区域中看到)(zzz2 zzz)
翻译......
zzz2
"arg is: zzz"
并返回nil
nil
到nil
(在回声中看到的是底部)这里最重要的“外卖”是宏只是在解释器(编译器)启动之前对代码进行操作的函数。
这些函数的参数未被评估(即zzz1
和zzz2
,arg
为zzz
,而非123
。
它们的评估方式与任何其他lisp函数一样(例如,它们的主体中可以包含宏形式;主体包含在隐式progn
;& c)中。
他们的返回值由解释器而不是原始表单评估。