(esto se basa en la answer a la pregunta que ha escrito en los comentarios).
la ->
macro toma cada argumento, lo que es una lista si es necesario (la aplicación de funciones "en bruto" a no hay args - Convertir myfunc
-(myfunc)
), y luego inserta el primer argumento de ->
como segundo argumento en cada una de esas listas.
así (-> foo myfunc)
se convierte en (-> foo (myfunc))
se convierte en (myfunc foo)
, aproximadamente.
esto se describe en el docs for ->
.
el problema con las funciones anónimas es que son generadas por una macro de lector como described here (scroll down). eso significa que #(...)
se convierte (antes de macro expansión normal) en (fn [...] ...)
. lo cual está bien, pero, críticamente, ya es una lista.
por lo que la macro cree que la función anónima ya se está aplicando, cuando en realidad se encuentra con una definición de función (ambas son listas). y al agregar los parens "adicionales", como se describió anteriormente en la otra respuesta, se aplica la función anónima a ningún argumento.
el motivo de este comportamiento poco intuitivo es que la heurística dwim (do-what-i-mean, no dwim-witted, aunque ...) utilizada por la macro ->
, agregada para permitirle proporcionar "bare "Las funciones en lugar de requerir que las aplique a ningún argumento incluyéndolas en una lista, es solo una heurística; simplemente prueba una lista y se confunde con la definición de la función creada por la macro del lector.
[en mi mala opinión, ->
está mal implementado y en su lugar debe rechazar todas las funciones "simples", en cambio, solo acepta aplicaciones de funciones; entonces parecería más consistente. si no, al menos los documentos podrían ser más claros, explicando la semántica motivadora detrás de colocar cosas en las listas.]
posible duplicado de [Llamada de función en -> macro de roscado] (http://stackoverflow.com/questions/7838326/function-call-in-threading-macro) – amalloy