2017-09-02 45 views
2

我不明白如何获得完整的宏观扩展。为什么macroexpansion不能扩展Clojure中的嵌套窗体?

有了这个代码

(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功能的,所以我想 macroexpand不能在嵌套结构的工作。我对吗 ?

回答

6

你说得对。

又见https://clojuredocs.org/clojure.core/macroexpand

凡指出:

注既不macroexpand-1或macroexpand扩大宏在子窗体。

事实上macroexpand,所有做递归扩展:

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

参见https://clojuredocs.org/clojure.walk/macroexpand-all

它指出:

执行递归形式的所有可能的macroexpansions。

你的榜样

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

可能混淆你,但它的文档告诉:

(macroexpand-1表格)如果形式表示宏形式,返回其 扩张,否则返回表单。

因此,'if'不是一个宏,它只是返回,如果没有进入子表单...