Macros Clojure宏扩展

Macros Clojure宏扩展,macros,clojure,Macros,Clojure,为什么 (macroexpand '(.. arm getHand getFinger)) 扩展到 (. (. arm getHand) getFinger) 当 扩展到 (getFinger (clojure.core/-> arm getHand)) 换句话说,为什么在第二个示例中,->没有完全展开?宏展开只展开形式,直到函数位置的符号不是宏为止。在->的情况下注意到这一点的原因是->宏是递归的 在您的例子中,您需要宏扩展所有表单clojure.walk,这就是我问的原因。mac

为什么

(macroexpand '(.. arm getHand getFinger))
扩展到

(. (. arm getHand) getFinger)

扩展到

(getFinger (clojure.core/-> arm getHand))

换句话说,为什么在第二个示例中,
->
没有完全展开?

宏展开
只展开形式,直到函数位置的符号不是宏为止。在
->
的情况下注意到这一点的原因是
->
宏是递归的


在您的例子中,您需要
宏扩展所有
表单clojure.walk

,这就是我问的原因。
macroexpand
不应该展开
->
,直到它不是宏吗?我查看了
->
的源代码,它似乎最终解析为“([x形式](if(seq?形式)(带meta`(~(first form)~x~@(next form))(meta form))(list form x))”)”也许我没有正确理解它。@Ralph:
宏扩展
不会在子表单中扩展宏,因此
(>arm getHand getFinger)
扩展到
(clojure.core/->(clojure.core/->arm getHand)getFinger)
它扩展(因为->是一个宏)到
(getFinger(clojure.core/->arm getHand))
。扩展在此停止,因为
getFinger
不是宏。
(getFinger (clojure.core/-> arm getHand))