La macro ->
aggiunge i parenti intorno a apply-str
nella seconda versione, ecco perché la macro si espande al codice che finisce per chiamare la funzione. Guardare il codice sorgente per ->
e si può vedere:
(defmacro ->
"Threads the expr through the forms. Inserts x as the
second item in the first form, making a list of it if it is not a
list already. If there are more forms, inserts the first form as the
second item in second form, etc."
([x] x)
([x form] (if (seq? form)
(with-meta `(~(first form) ~x [email protected](next form)) (meta form))
(list form x)))
([x form & more] `(-> (-> ~x ~form) [email protected])))
La parte rilevante è quando si sta trattando con due argomenti, x
e form
. Se form
è un seq, x
viene inserito come secondo argomento in tale elenco. In caso contrario, la macro inserisce form
e x
in una lista stessa. In questo modo è possibile utilizzare un simbolo nudo come abbreviazione di un elenco contenente un simbolo.
user> (macroexpand '(-> 123 (foo)))
(foo 123)
user> (macroexpand '(-> 123 foo))
(foo 123)
fonte
2010-04-05 17:18:12
Il codice che sto cercando di scrivere è un po 'più complesso di quello. Questo è solo un esempio semplificato. Voglio solo capire meglio come funziona la macro '->'. :-) –
Ah, gotcha. Ad ogni modo, vedi cosa sta succedendo qui? –
Sì, sì. Grazie per la tua risposta! –