微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 时,宏可能会被扩展,或者如果失败,在需要评估扩展代码之前按需扩展(但您应该始终假设扩展完全独立于随后的评估)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。