Документация для макросов ->
и ->>
гласит, что формы после первого параметра помещаются в списки, если они еще не являются списками.Итак, вопрос в том, почему это не работает для форм #()
и (fn ..)
?Причина в том, что обе формы находятся в форме списка во время раскрытия макроса.
Например,
(-> 3 (fn [x] (println x)))
получает форму (fn [x] ...)
во время раскрытия, поэтому макрос считает, чтоэто список, я просто вставлю 3 во вторую позицию списка (fn ..)
. "Вызывая макроразложение, мы получаем следующее:
(fn 3 [x] (println x))
, что, конечно, не работает.Аналогично для #()
:
(-> 3 #(println %))
расширен до
(fn* 3 [p1__6274#] (println p1__6274#))
Вот почему нам нужны дополнительные парены.