2010-11-29 14 views
8

¿Por quéClojure macroexpand

(macroexpand '(.. arm getHand getFinger)) 

expanda a

(. (. arm getHand) getFinger) 

mientras

(macroexpand '(-> arm getHand getFinger)) 

expande a

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

En otras palabras, ¿por qué el -> no se expande por completo en el segundo ejemplo?

Respuesta

10

macroexpand solo expande la forma hasta que el símbolo en la posición de la función no sea una macro. La razón por la que nota esto en el caso de -> es porque la macro -> es recursiva.

En su caso, usted quiere macroexpand-all forma clojure.walk

+0

que en realidad es por eso que pedí. ¿No debería 'macroexpand' expandirse' -> 'hasta que no fuera una macro? Miré el código fuente para '->' y al final parece que se resuelve en "([x forma] (si (forma seq?) (Con-meta' (~ (primera forma) ~ x ~ @ (próxima forma)) (forma meta)) (lista forma x))) "Tal vez no lo estoy entendiendo correctamente. – Ralph

+1

@Ralph: 'macroexpand' no expande macros en subformularios, entonces' (-> arm getHand getFinger) 'se expande a' (clojure.core/-> (clojure.core/-> arm getHand) getFinger) 'que se expande (porque -> es una macro) a '(getFinger (clojure.core/-> arm getHand))'. La expansión se detiene aquí porque 'getFinger' no es una macro. – Brian

+0

Gracias. Ya lo pillo. – Ralph