gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:15 26 4
gpt4 key购买 nike

如下面的 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/

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