Lisp- 在宏中使用 `'` 和 `list`
Lisp- Usage of `'`and `list` in macros
我正在尝试学习 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
对我来说似乎很奇怪。有人可以给我解释一下吗?
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 文件被 load
ed 时扩展,或者,如果失败,在扩展代码需要被评估之前按需扩展(但你应该总是假设展开完全独立于后续评估。
我正在尝试学习 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
对我来说似乎很奇怪。有人可以给我解释一下吗?
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 文件被 load
ed 时扩展,或者,如果失败,在扩展代码需要被评估之前按需扩展(但你应该总是假设展开完全独立于后续评估。