16

clojure1.5リリースノートからこのコードを理解していません。cond->マクロを使用します。たとえば、1.5より前のコードにどのように変換されますか?

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

1 に答える 1

27

各ステップは、テストが真の場合は結果を変更し、テストが偽の場合は結果をそのままにします。

これは、無名関数をスレッド化することで 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

一部のフォームで記号を使用する場合に備えてgensymforを使用しますgg


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

*この例では、と+が交換可能であるため、同じ結果が得られます。

于 2012-12-12T00:01:51.090 に答える