gpt4 book ai didi

recursion - macrolet 是否禁止本地定义的宏之间的递归调用?

转载 作者:行者123 更新时间:2023-12-04 23:44:01 24 4
gpt4 key购买 nike

在他的书中ANSI Common Lisp ,第 320 页,Paul Graham 写道 macrolet :“就像 flet 一样,本地宏可能不会相互调用。”

也许我误解了这一点,但我想不出任何可能是真的。宏不会相互调用,而是相互扩展,并且宏扩展的性质是这样的,它会一直持续到作用域中定义的所有宏都被扩展掉为止。

在我尝试过的 Common Lisp 的每个实现中,以下代码都与 Graham 不一致:

(macrolet ((jump (x) `(car ,x))
(skip (x) `(jump ,x))
(hop (x) `(skip ,x)))
(hop '(1 2 3)))

=> 1

(macrolet ((yin (n x)
(if (zerop n)
`(cdr ,x)
`(yang ,(1- n) ,x)))
(yang (n x)
(if (zerop n)
`(car ,x)
`(yin ,(1- n) ,x))))
(yin 6 '(1 2 3)))

=> (2 3)

格雷厄姆的陈述是错误的吗?

最佳答案

macrolet 定义的宏是可以的扩展为使用相同 macrolet 中定义的不同宏.由 macrolet 定义的宏是不正确的直接使用相同 macrolet 中定义的不同宏.例如:

(macrolet ((jump (x) `(car ,x))
;; Okay since skip expands into jump.
(skip (x) `(jump ,x)))
(skip '(1 2 3)))

=> 1


(macrolet ((jump (x) `(car ,x))
;; Wrong since skip uses jump directly.
(skip (x) (jump x)))
(skip '(1 2 3)))

=> Error: The function COMMON-LISP-USER::JUMP is undefined.

关于recursion - macrolet 是否禁止本地定义的宏之间的递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32076319/

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