Clojure-New Cond Macro?

Zch*_*yvr 16 clojure

我不理解clojure 1.5发行说明中的这段代码.它使用cond->宏.例如,它将如何转换为1.5之前的代码?

user=> (cond-> 1
               true inc
               false (* 42)
               (= 2 2) (* 3))
6
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 27

如果测试为真,则每个步骤都会更改结果;如果测试为假,则每个步骤都会更改结果.

你可以通过线程匿名函数在1.4中写这个:

user> (-> 1 (#(if true (inc %) %)) 
            (#(if false (* % 42) %)) 
            (#(if (= 2 2) (* % 3) %)))
6
Run Code Online (Sandbox Code Playgroud)

虽然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
Run Code Online (Sandbox Code Playgroud)

并使用一个gensym表示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
Run Code Online (Sandbox Code Playgroud)

在这个例子中给出了相同的结果,因为*+是可交换的.