Подтвердить что ты не робот

Разница между стрелками и макросами двойной стрелки в Clojure

В чем разница между макросами -> и ->> в Clojure?

4b9b3361

Ответ 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)