在Clojure中较小的,(for [x (range 1 8) y (range 1 8)] [x y])
的x
和1
运行笛卡尔乘积y
与y
回到7
为每每次迭代x
。
从REPL:
user=> (for [x (range 1 8) y (range 1 8)] [x y])
([1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [1 7] [2 1] [2 2] [2 3] [2 4] [2 5] [2 6] [2 7] [3 1] [3 2] [3 3] [3 4] [3 5] [3 6] [3 7] [4 1] [4 2] [4 3] [4 4] [4 5] [4 6] [4 7] [5 1] [5 2] [5 3] [5 4] [5 5] [5 6] [5 7] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6] [6 7] [7 1] [7 2] [7 3] [7 4] [7 5] [7 6] [7 7])
在你的例子,:while
与y
而不是x
有关。因此:while
适用于y
的每次迭代,然后在x
的下一次迭代之后重新启动。
为了使这更清楚,请注意,你也可以用:while
关联x
:
user=> (for [x (range 1 8) :while (odd? x) y (range 1 8)] [x y])
([1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [1 7])
它运行循环而x
是奇数,则休息。
所以在你的第一个例子,:while
休息每一次迭代上y
时y
等于1
因为没有x
值,对于这个(and (< x 1) (even? x))
持有true
。
你的第二个例子,在另一方面,适用于中y
因为(< 1 1)
产量false
第一次迭代,因为即使:while
短时休息,y
第二次迭代成功,因为x
开始从2
,所以如果y
是1
,并且(and (< y x) (even? x))
是(and (< 1 2) (even? 2))
,其评估为true
。
请参阅http://clojuredocs.org/clojure_core/clojure.core/for了解更多详情。特别是显示:when
和:while
之间区别的部分。
':while'没有绑定到整个'for'构造,只有迭代到'y'的部分,然后*在每次增加'x'时重新启动*。查看我的答案了解更多详情。 – dg123
另请参阅http://clojuredocs.org/clojure_core/clojure.core/for,并查看演示':when'和':while'之间区别的部分。 – dg123