以下显示修饰符“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])
这是怎么发生的?
答案 0 :(得分:5)
:while
和:when
修饰符总是在它们之前的绑定之后被检查,并且仅适用于那个循环的迭代。如果要停止绑定新的x
,则需要将:while
放在x
子句之后,而不是y
子句。