使用:在Clojure中使用修饰符

时间:2013-01-04 12:01:40

标签: clojure

我想知道在Clojure中使用:let循环时for修饰符有什么意义?

2 个答案:

答案 0 :(得分:7)

:let允许您定义命名值,与let特殊形式允许您这样做:

(for [i (range 10) 
      :let [x (* i 2)]] 
  x) ;;=> (0 2 4 6 8 10 12 14 16 18)

相当于:

(for [i (range 10)] 
  (let [x (* i 2)] 
  x)) ;;=> (0 2 4 6 8 10 12 14 16 18)

除非与:when(或:while)组合使用时使用

(for [i (range 10) 
          :let [x (* i 2)]
          :when (> i 5)] 
      x) ;;=> (12 14 16 18)

(for [i (range 10)] 
  (let [x (* i 2)] 
    (when (> i 5) x))) ;;=> (nil nil nil nil nil nil 12 14 16 18)

答案 1 :(得分:1)

您可以使用:letlet等列表理解中创建绑定。

引用clojure documentation

的示例
user=> (for [x [0 1 2 3 4 5]
             :let [y (* x 3)]
             :when (even? y)]
         y)
(0 6 12)

诀窍是,你现在可以在y:while修饰符中使用:when,而不是写

之类的内容
user=> (for [x [0 1 2 3 4 5]
             :when (even? (* x 3))]
         (* x 3))