有什么区别:while和:什么时候在clojure?

Joh*_*ang 13 for-loop clojure

我正在研究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])
Run Code Online (Sandbox Code Playgroud)

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

Ger*_*ert 25

:when迭代绑定,但只在条件为真时才计算循环体.:while迭代绑定并评估正文,直到条件为false:

(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)
Run Code Online (Sandbox Code Playgroud)

  • 注意,如果愿意,您可以使用(不是= x 10)而不是(不是(= x 10)). (3认同)

Cho*_*ser 7

:when阻止任何内部'for'绑定或其体表达式被评估为一次迭代,就像'filter'函数一样.

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