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

который в этом примере дает тот же результат, потому что * и + являются коммутативными.