(dies i in den Kommentaren gepostet auf der answer auf die Frage basiert).
das ->
Makro nimmt jedes Argument, eine Liste zu machen, falls erforderlich („raw“ Funktionen ohne args Anwendung - myfunc
-(myfunc)
Umwandlung) und fügt dann das erste Argument ->
als zweites Argument in jedem dieser Listen.
so (-> foo myfunc)
wird (-> foo (myfunc))
wird (myfunc foo)
, grob.
Dies ist alles in der docs for ->
beschrieben.
Das Problem mit anonymen Funktionen ist, dass sie von einem Lesemakro wie described here (scroll down) erzeugt werden. Das bedeutet, dass #(...)
(vor normale Makroexpansion) in (fn [...] ...)
konvertiert wird. Das ist in Ordnung, aber, kritisch, ist bereits eine Liste.
so glaubt das Makro, dass die anonyme Funktion bereits angewendet wird, wenn es tatsächlich eine Funktionsdefinition (beide Listen) ist. und das Hinzufügen der "extra" -Parens - wie oben in der anderen Antwort beschrieben - wendet die anonyme Funktion auf keine Argumente an.
Der Grund für dieses unintuitive Verhalten ist, dass die dwim (do-was-i-mean, nicht dwim-witted, obwohl ...) Heuristik vom ->
Makro verwendet wird, um Ihnen zu ermöglichen, "bare" zu liefern "Funktionen, anstatt dass Sie sie auf keine Argumente anwenden, indem Sie sie in eine Liste einschließen, ist nur eine Heuristik - es testet einfach für eine Liste - und ist durch die Funktionsdefinition durch den Leser Makro verwirrt.
[in meiner schlechten Meinung, ->
ist schlecht implementiert und sollte stattdessen alle "bare" Funktionen ablehnen, sondern nur Funktionsanwendungen akzeptieren; es würde dann konsequenter erscheinen. wenn nicht, dann könnten zumindest die Dokumente klarer sein und die motivierende Semantik hinter dem Platzieren von Dingen in Listen erklären.]
möglich Duplikat von [Funktionsaufruf in -> threading Makro] (http://StackOverflow.com/questions/7838326/Function-Call-in-Threading-Macro) – amalloy