Clojure -New Cond Macro? Я не понимаю этот код из clojure 1.5 примечаний к выпуску. Он использует макрос cond->. Например, как он переводится в код pre-1.5? user=> (cond-> 1 true inc false (* 42) (= 2 2) (* 3)) 6 Ответ 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 который в этом примере дает тот же результат, потому что * и + являются коммутативными.
Ответ 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 который в этом примере дает тот же результат, потому что * и + являются коммутативными.