2010-11-29 5 views
8

WarumClojure macroexpand

(macroexpand '(.. arm getHand getFinger)) 

zu

(. (. arm getHand) getFinger) 

erweitern, während

(macroexpand '(-> arm getHand getFinger)) 

expandiert nach

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

Mit anderen Worten, warum wird die -> im zweiten Beispiel nicht vollständig erweitert?

Antwort

10

macroexpand erweitert nur das Formular, bis das Symbol in der Funktionsposition kein Makro ist. Der Grund, warum Sie dies im Fall von -> bemerken, ist, weil das -> Makro rekursiv ist.

In Ihrem Fall sollten Sie macroexpand-all Form clojure.walk

+0

das eigentlich ist, warum, fragte ich. Sollte 'macroexpand' nicht erweitert haben ->' bis es kein Makro war? Ich schaute auf den Quellcode für '->' und es scheint sich schließlich zu "([x form] (wenn (seq? Form)) (mit-meta' (~ (erste Form) ~ x ~ @ (nächste Form)) (Metaform)) (Listenform x))) "Vielleicht verstehe ich es nicht richtig. – Ralph

+1

@Ralph: 'macroexpand' erweitert Makros in Unterformularen nicht, also' (-> arm getHand getFinger) 'expandiert zu' (clojure.core/-> (clojure.core/-> arm getHand) getFinger) 'was expandiert (weil -> ist ein Makro) zu '(getFinger (clojure.core/-> arm getHand))' '. Die Erweiterung stoppt hier, weil 'getFinger' kein Makro ist. – Brian

+0

Danke. Hab es jetzt verstanden. – Ralph