【问题标题】:Lisp- Usage of `'`and `list` in macrosLisp-在宏中使用`'`和`list`
【发布时间】:2021-05-10 13:04:15
【问题描述】:

我正在努力学习 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 对我来说似乎很奇怪。谁能给我解释一下?

【问题讨论】:

  • 我开始为您之前的问题输入一个相当详细的答案,但您在我有机会完成之前将其删除。
  • 哦,我很抱歉,我想通过问一个更简单但更精确的问题来澄清我的问题。如果我取消删除它会有帮助吗? :(
  • 宏章节确实解释了所有这些。很简单,可以写(defmacro inc (var) `(setq ,var (1+ ,var)) );查找此其他引用机制的文档。
  • 我必须运行,所以现在可能不值得取消删除。如果您在 12 小时后有空,我们或许可以尝试协调。但要点是,请查看 Emacs Lisp 参考手册。
  • 宏的意义在于,它们允许您以函数无法做到的方式塑造语言的语法。您付出的代价是它们需要更复杂的报价。

标签: macros common-lisp elisp


【解决方案1】:

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

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

宏生成/返回代码

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2019-11-17
    • 2011-03-08
    相关资源
    最近更新 更多