【问题标题】:Clojure-New Cond Macro?Clojure-New Cond 宏?
【发布时间】:2012-12-12 09:33:20
【问题描述】:

我不明白来自clojure 1.5 release notes 的这段代码。它使用cond-> 宏。例如,它将如何转换为 1.5 之前的代码?

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

【问题讨论】:

标签: clojure


【解决方案1】:

如果测试为真,每一步都会改变结果,如果测试为假,则不处理。

您可以在 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 表示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

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

【讨论】:

  • 我非常……非常喜欢中间的例子。这让它更清楚了。
  • 另外,我假设 cond->> 宏执行类似的例程?
  • 抱歉,你评论的时候我正在编辑它,中间是哪个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2012-11-19
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多