Das ->
Makro fügt Parens um apply-str
in Ihrer zweiten Version hinzu, weshalb das Makro zu Code erweitert wird, der Ihre Funktion schließlich aufruft. Schauen Sie sich den Quellcode für ->
und Sie können sehen:
(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])))
Der relevante Teil ist, wenn es mit zwei Argumenten zu tun, x
und form
. Wenn form
ein Seq ist, wird x
als das zweite Argument in der Liste eingefügt. Andernfalls fügt das Makro form
und x
es in eine Liste selbst ein. So können Sie ein leeres Symbol als Kurzform für eine Liste mit einem Symbol verwenden.
user> (macroexpand '(-> 123 (foo)))
(foo 123)
user> (macroexpand '(-> 123 foo))
(foo 123)
Der Code, den ich schreiben möchte, ist etwas komplexer als das. Dies ist nur ein vereinfachtes Beispiel. Ich möchte nur ein besseres Verständnis davon bekommen, wie das '->' Makro funktioniert. :-) –
Ah, hab ich. Wie auch immer, siehst du, was hier vor sich geht? –
Ja, das tue ich. Danke für deine Antwort! –