2012-12-11 9 views
16

clojure 1.5 release notesからこのコードを理解できません。これは、cond->マクロを使用します。たとえば、それは1.5より前のコードにどのように変換されますか?Clojure-New Condマクロ?

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

どこを見つけましたか? – mishadoff

+0

私はこれが6 = '(* 3(inc 1))'を与えていると思います。ここでは、述語が真と評価される関数を通して最初の引数をスレッドします。 – cobbal

+1

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

答えて

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 

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 

+0

私は非常に中間の例が好きです。それははるかに明確にしました。 – Zchpyvr

+0

また、 'cond - >>'マクロも同様のルーチンを実行すると仮定していますか? – Zchpyvr

+0

申し訳ありませんが、私はあなたがコメントしている間に編集していましたが、それは中間でしたか? –

関連する問題