lisp - 如何理解Lisp中宏定义中的参数绑定(bind)?

标签 lisp common-lisp

如下面的 Lisp 代码所示,

(defvar a 1)
(defvar b 2)

(defmacro macro-add (c d)
    `(+ ,c ,d))

(macro-add a b)

调用宏的最后一行绑定(bind)传入的宏参数c,是说c绑定(bind)了符号a还是绑定(bind)了符号a绑定(bind)的值?更具体地说,c 在宏上下文中会被评估为 a 还是 1?

最佳答案

宏基本上是代码转换器。他们将代码作为输入,解构并绑定(bind)到宏参数。他们使用任意计算生成新代码。对于简单的类似模板的代码生成,反引号列表很受欢迎。

Lisp 中的源代码有两种不同的外观:文本 s 表达式和内部的所谓形式,它们已经是 Lisp 数据。此转换由 Lisp 阅读器完成。

然后对这些 Lisp 形式进行宏转换。这种转变的结果是一种新的形式。最终,在展开所有宏之后,将对生成的源代码进行求值。这张图有点错误,但有助于想象三个独立的阶段:读取、宏展开、执行。

在您的例子中,源表单是三个符号的列表:(macro-add a b)。第一个符号命名一个宏,所以表格将被宏展开。列表被解构:第一个符号是宏名称,第二个符号将绑定(bind)到 C,第三个符号将绑定(bind)到 D。有了这个参数,宏现在就被执行了。结果它产生了一个新的形式:一个包含三个项目的列表。第一项是符号+,第二项是C的值,符号A,第三项是的值code>D,符号B(+ A B)是宏展开的结果。

如有必要,宏扩展的结果现在将再次进行宏扩展。由于代码中的 + 不是宏,因此不会进行宏扩展。 + 是一个函数。现在开始普通的求值:计算A的值,计算B的值,然后用这两个值调用+来计算a新的结果值。

关于lisp - 如何理解Lisp中宏定义中的参数绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7396991/

相关文章:

lisp - 可视化编程工具

syntax-error - Lisp - 替换列表中元素的所有外观

objective-c - 我如何真正用 NSNumbers 做数学? (在 obj-c 中实现 lisp)

lisp - 检查元素是否在树中

lisp - lisp 中的良好风格 : cons vs list

prolog - 如何将这个 Prolog 程序转换成 Lisp 程序?

lisp - 如何在 lisp 中读取和编辑 file.txt 的内容

sorting - Common Lisp 连接和换行

tree - 检查 Common Lisp 中的 n 叉树是否平衡

macos - 在 CLISP 中更新到 ASDF 3.x