В чем разница между макросами ->
и ->>
в Clojure?
Разница между стрелками и макросами двойной стрелки в Clojure
Ответ 1
Документы A. Webb связаны с объяснением "чего", но не делают хорошей работы "почему".
Как правило, когда функция работает над особым субъектом, этот субъект является первым аргументом (например, conj
, assoc
). Когда функция работает над объектом последовательности, этот субъект является последним аргументом (например, map
, filter
).
Таким образом, ->
и ->>
документируются как потоки первого и последнего аргументов соответственно, но также полезно рассматривать их как применимые к сингулярным или последовательным аргументам соответственно.
Например, мы можем рассматривать вектор как особый объект:
(-> [1 2 3]
(conj 4) ; (conj [1 2 3] 4)
(conj 5) ; (conj [1 2 3 4] 5)
(assoc 0 0)) ; (assoc [1 2 3 4 5] 0 0)
=> [0 2 3 4 5]
Или мы можем рассматривать его как последовательность:
(->> [1 2 3]
(map inc) ; (map inc [1 2 3])
(map inc) ; (map inc (2 3 4))
(concat [0 2])) ; (concat [0 2] (3 4 5))
=> (0 2 3 4 5)