while修饰符在clojure中意味着什么?

时间:2012-07-20 06:46:25

标签: clojure

以下显示修饰符“while”表示一旦元素与检查匹配,迭代将停止:

=> (for [x [3 2 3 1] :while (< x 3)] x)
()

然而为什么以下不停止迭代?它应该在我的(错误的)理解中返回一个空列表。

=> (for [x [3 2 3 1] y [:a :b] :while (< x 3)] [x y])
([2 :a] [2 :b] [1 :a] [1 :b])

实际上,事实证明在这种情况下“when”和“while”修饰符之间没有区别。

=> (for [x [3 2 3 1] y [:a :b] :when (< x 3)] [x y])
([2 :a] [2 :b] [1 :a] [1 :b])

这是怎么发生的?

1 个答案:

答案 0 :(得分:5)

:while:when修饰符总是在它们之前的绑定之后被检查,并且仅适用于那个循环的迭代。如果要停止绑定新的x,则需要将:while放在x子句之后,而不是y子句。