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
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
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.
dove l'hai trovato? – mishadoff
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
https://github.com/clojure/clojure/blob/master/changes.md#24-new-threading-macros –