gpt4 book ai didi

macros - 在 Common Lisp 中,为什么宏 OR 使用 gensym 而不是 AND?

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

在 Common Lisp (SBCL 1.0.58) 中,为什么宏 OR 使用 gensym 而不是 AND?

例如,

    CL-USER> (macroexpand '(and 1 2 3 4 5))
(IF 1
(AND 2 3 4 5)
NIL)
T
CL-USER> (macroexpand '(or 1 2 3 4 5))
(LET ((#:G967 1))
(IF #:G967
#:G967
(OR 2 3 4 5)))
T
CL-USER>

我查看了 defboot.lisp,其中定义了宏,但在注释中没有发现任何相关内容。

最佳答案

那是因为实现的逻辑运算符是 short-circuiting并返回他们评估的最后一个表单产生的值。

为了实现这一点,and 不需要 gensym,因为它求值的最后一个形式要么产生 NIL,要么是对自身的最终尾调用。

另一方面,or 必须返回它评估的第一个非NIL 值,因此它不能依赖于尾部调用。它需要一个 gensym 来做到这一点,因为没有一个:

(IF 1
1
(OR 2 3 4 5))

1 在扩展中出现了两次,在我们的例子中,这意味着生成 1 的表达式被求值两次And you never want that in your macros .

关于macros - 在 Common Lisp 中,为什么宏 OR 使用 gensym 而不是 AND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147895/

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