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

Lisp- Usage of `'`and `list` in macros

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

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

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

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

为什么我不能写:

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

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

Won't this make them to a list of literal elements? (For example a list containing three elements (setq var (1+ var))

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

一个宏generates/returnscode.

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

就字节编译的 .elc 文件的内容而言,您在 .el 源文件中使用这些内容没有区别:

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

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

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