clojure 1.5 release notesからこのコードを理解できません。これは、cond->
マクロを使用します。たとえば、それは1.5より前のコードにどのように変換されますか?Clojure-New Condマクロ?
user=> (cond-> 1
true inc
false (* 42)
(= 2 2) (* 3))
6
clojure 1.5 release notesからこのコードを理解できません。これは、cond->
マクロを使用します。たとえば、それは1.5より前のコードにどのように変換されますか?Clojure-New Condマクロ?
user=> (cond-> 1
true inc
false (* 42)
(= 2 2) (* 3))
6
各ステップは、テストが真であれば結果を変更し、テストが偽であれば結果を変更します。
あなたは無名関数を通すことによって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
とg
の場合はgensym
を使用します。一部のフォームでは、記号を使用します。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
。
どこを見つけましたか? – mishadoff
私はこれが6 = '(* 3(inc 1))'を与えていると思います。ここでは、述語が真と評価される関数を通して最初の引数をスレッドします。 – cobbal
https://github.com/clojure/clojure/blob/master/changes.md#24-new-threading-macros –