我想知道在Clojure中使用:let
循环时for
修饰符有什么意义?
答案 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)
您可以使用:let
在let
等列表理解中创建绑定。
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))