(это основано на answer на вопрос я писал в комментариях).
->
макро принимает каждый аргумент, что делает его список, если это необходимо (применяя «сырую» функцию в каких-либо аргументов - преобразование myfunc
к (myfunc)
), а затем вставляет первый аргумент ->
в качестве второго аргумента в каждом из этих списков.
так (-> foo myfunc)
становится (-> foo (myfunc))
становится (myfunc foo)
, примерно.
все это описано в docs for ->
.
проблема с анонимными функциями заключается в том, что они генерируются макросом читателя как described here (scroll down). это означает, что #(...)
преобразуется (до нормальное расширение макроса) в (fn [...] ...)
. что хорошо, но критически уже есть список.
поэтому макрос считает, что анонимная функция уже применяется, когда на самом деле она встречает определение функции (оба являются списками). и добавление «дополнительных» парен - как описано выше в другом ответе - применяет анонимную функцию к никаким аргументам.
Причина этого неинтуитивного поведения заключается в том, что dwim (do-what-i-mean, а не dwim-witted, хотя ...) эвристика, используемая макросом ->
, добавлена, чтобы вы могли предоставить «голые "вместо того, чтобы требовать, чтобы вы применяли их к никаким аргументам, вставляя их в список, является только эвристический - он просто проверяет список - и путается с определением функции, созданным макросом читателя.
[по моему плохой оценке, ->
плохо реализован и должен отклонять все «голые» функции, вместо этого принимать только приложения-функции; тогда он будет казаться более последовательным. если нет, то, по крайней мере, документы могут быть более ясными, объясняя мотивацию семантики за размещением вещей в списках.]
Возможный дубликат [Function call in -> threading macro] (http://stackoverflow.com/questions/7838326/function-call-in-threading-macro) – amalloy