gpt4 book ai didi

macros - clojure 中的宏是如何扩展的?

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

在《Programming Clojure(Stuart)》一书中,在阅读如何扩展宏时,我感到困惑。

user=> (defmacro chain
([x form] (list '. x form))
([x form & more] (concat (list 'chain (list '. x form)) more)))
#'user/chain

上面的宏可以扩展为:
user=> (macroexpand '(chain a b c))
(. (. a b) c)

但以下只展开到第一层:
user=> (macroexpand '(and a b c))
(let* [and__3822__auto__ a]
(if and__3822__auto__ (clojure.core/and b c) and__3822__auto__))

宏源:
user=> (source and)
(defmacro and([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))

为什么是 链条 宏一路扩展,但 不是 ?为什么它没有扩展到如下所示的内容:
user=> (macroexpand '(chain a b c d))
(. (chain a b c) d)

最佳答案

macroexpand一遍又一遍地扩展最外层的形式,直到得到一个非宏观的结果。如果您只想查看宏展开的单个阶段的输出,请使用 macroexpand-1 .

所以区别在于,chain的递归调用是第一个,和and不是。

关于macros - clojure 中的宏是如何扩展的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11321880/

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