2012-12-11 12 views
16

Non capisco questo codice dallo clojure 1.5 release notes. Utilizza la macro cond->. Ad esempio, come si tradurrebbe in codice pre-1.5?Clojure-New Cond Macro?

user=> (cond-> 1 
       true inc 
       false (* 42) 
       (= 2 2) (* 3)) 
6 
+0

dove l'hai trovato? – mishadoff

+0

Ad una ipotesi immagino che ciò dia 6 = '(* 3 (inc 1))', dove converte il primo argomento in tutte le funzioni il cui predicato diventa true. – cobbal

+1

https://github.com/clojure/clojure/blob/master/changes.md#24-new-threading-macros –

risposta

27

Ogni passaggio modifica il risultato se il test è true o lo lascia solo se il test è falso.

Si potrebbe scrivere questo in 1.4 infilando funzioni anonime:

user> (-> 1 (#(if true (inc %) %)) 
      (#(if false (* % 42) %)) 
      (#(if (= 2 2) (* % 3) %))) 
6 

Anche se il cond-> non introduce nuove funzioni, invece genera una forma vincolante per essere più efficienti:

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 

e utilizza uno gensym per g in alcuni dei moduli utilizzare il simbolo g


cond->> è molto simile, posiziona semplicemente il simbolo filettato in un posto diverso.

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 

che in questo esempio fornisce lo stesso risultato perché * e + sono commutativa.

+0

Mi piace molto l'esempio di mezzo molto ... molto. Ciò ha reso molto più chiaro. – Zchpyvr

+0

Inoltre, suppongo che la macro 'cond - >>' faccia una routine simile? – Zchpyvr

+0

scusate, lo stavo modificando mentre commentaste, che era il mezzo? –