7

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

4

2 回答 2

9

: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)
于 2013-01-04T12:53:20.437 回答
1

您可以使用:let在列表推导中创建绑定,例如let.

引用clojure 文档的示例:

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

诀窍是您现在可以y:whileand:when修饰符中使用,而不是编写类似的东西

user=> (for [x [0 1 2 3 4 5]
             :when (even? (* x 3))]
         (* x 3))
于 2013-01-04T12:54:06.750 回答