困惑:Clojure for循环:while - >意外行为?

jbe*_*ear 12 clojure

我一直在学习Clojure并对以下内容感到困惑:

user=> (for [a (range 1 4) b (range 1 4)] [a b])
([1 1] [1 2] [1 3] [2 1] [2 2] [2 3] [3 1] [3 2] [3 3]); _no surprise here_
Run Code Online (Sandbox Code Playgroud)

让我们添加:while (not= a b),我希望看到一个空列表,因为如果条件为假,循环应该停止.在这种情况下,它是a= b= 1的第一个项目.让我们来看看:

user=> (for [a (range 1 4) b (range 1 4) :while (not= a b) ] [a b])

([2 1] [3 1] [3 2]) ; _surprise!_
Run Code Online (Sandbox Code Playgroud)

改变:while:when过滤掉(= a b)

user=> (for [a (range 1 4) b (range 1 4) :when (not= a b) ] [a b])
([1 2] [1 3] [2 1] [2 3] [3 1] [3 2]); _expected_
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么(for [ ... :while ..] ...)会这样吗?

我在OS X上使用Clojure 1.3.

谢谢你,并为缺乏格式而道歉.这是我在StackOverflow上的处女帖子.

Nik*_*zov 9

让我们看看每次迭代.

a = 1
  b = 1 -> a == b, break because of while

a = 2
  b = 1 -> a != b, print [2 1]
  b = 2 -> a == b, break because of while

a = 3
  b = 1 -> a != b, print [3 1]
  b = 2 -> a != b, print [3 2]
  b = 3 -> a == b, break because of while
Run Code Online (Sandbox Code Playgroud)