Ответ 1
Каждый шаг изменяет результат, если тест является истинным, или оставляет его в покое, если тест является ложным.
Вы можете записать это в 1.4 путем потоковой передачи анонимных функций:
user> (-> 1 (#(if true (inc %) %))
(#(if false (* % 42) %))
(#(if (= 2 2) (* % 3) %)))
6
Хотя cond->
не вводит новые функции, вместо этого он создает более эффективную форму привязки:
user> (let [g 1
g (if true (inc g) g)
g (if false (* g 42) g)
g (if (= 2 2) (* g 3) g)]
g)
6
и использует gensym
для g
, если некоторые из форм используют символ g
cond->>
очень похож, он просто помещает резьбовой символ в другое место.
user> (let [g 1
g (if true (inc g) g)
g (if false (* 42 g) g)
g (if (= 2 2) (* 3 g) g)]
g)
6
который в этом примере дает тот же результат, потому что *
и +
являются коммутативными.