gpt4 book ai didi

clojure - 为什么宏扩展不扩展 Clojure 中的嵌套形式?

转载 作者:行者123 更新时间:2023-12-02 10:46:12 24 4
gpt4 key购买 nike

我不明白如何获得完整的宏扩展。

使用此代码

(when true (when true true))

我想要完整的宏扩展

(if true (do (if true (do true)))

但我不能

我了解macroexpansion-1将解决第一级扩展:

(macroexpand-1 '(when true (when true true)))

(if true (do (when true true)))

但是为什么当我再次调用macroexpand-1时(这就是macroexpand应该做的事情):

(macroexpand-1 '(if true (do (when true true))))

我得到了完全相同的结果?

(if true (do (when true true)))

我期待着一个完整的宏观扩展。

宏扩展仅适用于顶级表单吗?

我知道 clojure.walk 命名空间中有一个 expand-all 函数,所以我假设宏扩展不适用于嵌套结构。我对吗 ?

最佳答案

你是对的。

另请参阅https://clojuredocs.org/clojure.core/macroexpand

其中指出:

Note neither macroexpand-1 nor macroexpand expand macros in subforms.

事实上,macroexpand-all 会进行递归扩展:

> (clojure.walk/macroexpand-all '(when true (when true true))) 
(if true (do (if true (do true))))

另请参阅https://clojuredocs.org/clojure.walk/macroexpand-all

其中指出:

Recursively performs all possible macroexpansions in form.

你的例子

(macroexpand-1 '(if true (do (when true true))))

可能会让您感到困惑,但它确实如文档所示:

(macroexpand-1 form) If form represents a macro form, returns its expansion, else returns form.

因此,由于 'if' 不是宏,它只是返回 if,而不进入子表单...

关于clojure - 为什么宏扩展不扩展 Clojure 中的嵌套形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46018484/

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