clojure1.5リリースノートからこのコードを理解していません。cond->
マクロを使用します。たとえば、1.5より前のコードにどのように変換されますか?
user=> (cond-> 1
true inc
false (* 42)
(= 2 2) (* 3))
6
clojure1.5リリースノートからこのコードを理解していません。cond->
マクロを使用します。たとえば、1.5より前のコードにどのように変換されますか?
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
一部のフォームで記号を使用する場合に備えてgensym
forを使用します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
*
この例では、と+
が交換可能であるため、同じ結果が得られます。