Вызов функции в -> многопоточном макросе - PullRequest
9 голосов
/ 20 октября 2011

Нам нужны круглые скобки для вызова анонимной функции

user=> (-> [1 2 3 4] (conj 5) (#(map inc %)))
(2 3 4 5 6)

Почему в этих примерах нет необходимости использовать скобки вокруг map+ и fmap+?

user=> (def map+ #(map inc %))
#'user/map+
user=> (-> [1 2 3 4] (conj 5) map+)
(2 3 4 5 6)

user=> (defn fmap+ [xs] (map inc xs))
#'user/fmap+
(-> [1 2 3 4] (conj 5) fmap+)
(2 3 4 5 6)

1 Ответ

17 голосов
/ 20 октября 2011

Документация для макросов -> и ->> гласит, что формы после первого параметра помещаются в списки, если они еще не являются списками.Итак, вопрос в том, почему это не работает для форм #() и (fn ..)?Причина в том, что обе формы находятся в форме списка во время раскрытия макроса.

Например,

(-> 3 (fn [x] (println x)))

получает форму (fn [x] ...) во время раскрытия, поэтому макрос считает, чтоэто список, я просто вставлю 3 во вторую позицию списка (fn ..). "Вызывая макроразложение, мы получаем следующее:

(fn 3 [x] (println x))

, что, конечно, не работает.Аналогично для #():

(-> 3 #(println %))

расширен до

(fn* 3 [p1__6274#] (println p1__6274#))

Вот почему нам нужны дополнительные парены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...