16

我正在研究clojure,但不太清楚:while:when测试之间的区别:

=> (for [x [1 2 3] y [1 2 3] :while (= (mod x y) 0)] [x y])
([1 1] [2 1] [2 2] [3 1])
=> (for [x [1 2 3] y [1 2 3] :when (= (mod x y) 0)] [x y])
([1 1] [2 1] [2 2] [3 1] [3 3])

任何人都可以通过详细说明来提供帮助吗?

4

3 回答 3

28

:when迭代绑定,但仅在条件为真时评估循环体。:while迭代绑定并评估主体,直到条件为假:

(for [x (range 20) :when (not= x 10)] x)
; =>(0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19)

(for [x (range 20) :while (not= x 10)] x)
; => (0 1 2 3 4 5 6 7 8 9)
于 2012-06-10T05:32:34.770 回答
8

:when 防止任何内部 'for' 绑定或其主体表达式针对该一次迭代进行评估,就像 'filter' 函数一样。

:while 停止此绑定继续进行,更像是 'take-while'

于 2012-06-10T05:05:50.377 回答
1

看看这里的最后一个例子:http: //clojuredocs.org/clojure_core/clojure.core/for#example_913

于 2012-06-10T05:13:28.107 回答