Lisp- 在宏中使用 `'` 和 `list`

问题描述

我正在尝试学习 Elisp,所以我正在阅读 Elisp 的 GNU 手册。到目前为止的一切都很容易理解,但是当我阅读宏部分时,我遇到了一些我很难理解的事情。我也找不到合适的解释:

例如,一个简单的宏程序,将变量加 1:

(defmacro inc (var)
   (list 'setq var (list '1+ var)))

我不知道为什么 'setq 前面有 1+ 符号?这不会使它们成为文字元素列表吗? (例如一个包含三个元素的列表 (setq var (1+ var))

为什么我不能写:

; this seems more reasonable to me
(defmacro inc (var)
   (setq var (1+ var))

我不太确定 list 在这里是如何工作的,在这里使用 list 对我来说似乎很奇怪。谁能给我解释一下?

解决方法

这不会使它们成为文字元素列表吗? (例如包含三个元素 (setq var (1+ var))

正是如此(如果我们将实际参数替换为 var)。

宏生成/返回代码

这是宏的“扩展”阶段,通常发生在 elisp 文件的字节编译期间。

因此,就字节编译的 .elc 文件的内容而言,您在 .el 源文件中使用了这些内容中的任何一个都没有区别:

  • (inc foo)
  • (setq foo (1+ foo))

即在这两种情况下,获得字节编译的代码都是 (setq foo (1+ foo))

在字节编译之外,当 .el 文件被 loaded 时,宏可能会被扩展,或者如果失败,在需要评估扩展代码之前按需扩展(但您应该始终假设扩展完全独立于随后的评估)。