gpt4 book ai didi

emacs - 宏扩展 : to quote the body forms or not?

转载 作者:行者123 更新时间:2023-12-01 10:00:18 25 4
gpt4 key购买 nike

我很难准确理解宏扩展的工作原理。 elisp 解释器处理这两个代码片段的方式有什么不同?

(defmacro foo (arg)
(message "arg is: %s" arg))
(foo "bar")

和:
(defmacro foo (arg)
`(message "arg is: %s" ,arg))
(foo "bar")

最佳答案

你的例子可能会令人困惑,因为

  • message两者都显示一条消息并返回它。
  • 字符串(如“bar”)是自我评估的。

  • 有指导意义的例子
    (defconst zzz 123)
    (defmacro zzz1 (arg)
    `(insert (format "arg is: %s" ,arg)))
    (defmacro zzz2 (arg)
    (insert (format "arg is: %s" arg)))

    在 3 种形式中的每一种之后使用 C-x C-e 评估上面的代码。

    现在评估这些:

    第一个版本: (zzz1 zzz)
    口译员...
  • 调用zzz1的宏函数
  • 宏函数返回形式 (insert (format "arg is: %s" zzz))
  • 解释器评估表单,并插入 "arg is: 123"进入当前缓冲区,并返回 nil (见底部回波区)

  • 第二版: (zzz2 zzz)
    口译员...
  • 调用zzz2的宏函数
  • 宏函数插入 "arg is: zzz"在当前缓冲区中并返回 nil
  • 口译员评估 nilnil (在回声中看到的是底部)

  • 底线

    这里最重要的“收获”是宏只是在解释器(编译器)启动之前对代码进行操作的函数。

    这些函数的参数不求值(即,在 zzz1zzz2 中, argzzz ,而不是 123 )。

    它们的计算方式与任何其他 lisp 函数一样(例如,它们的主体中可以有宏形式;主体包含在隐式 progn ; &c 中)。

    它们的返回值由解释器而不是原始形式进行评估。

    关于emacs - 宏扩展 : to quote the body forms or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17093194/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com