所以我试试这段代码
(for [x (range 1 8) y (range 1 8) :while (and (< x y) (even? x))] [x y])
然后回来()
但我试试这个:
(for [x (range 1 8) y (range 1 8) :while (and (< y x) (even? x))] [x y])
我得到了理想的结果。 改变x和y的位置有什么影响?第一个片段不应该返回一个空列表..毕竟必须有一些比y小的y
答案 0 :(得分:8)
在Clojure中,(for [x (range 1 8) y (range 1 8)] [x y])
返回x
和y
的笛卡尔积,其中y
从1
返回到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
持有:while
。
另一方面,你的第二个例子是有效的,因为即使y
在(< 1 1)
的第一次迭代中断,因为false
产生y
,x
的第二次迭代{ {1}}成功,因为2
从y
开始,所以如果1
是(and (< y x) (even? x))
,(and (< 1 2) (even? 2))
是true
,其评估为{:when
1}}。
有关详细信息,请参阅http://clojuredocs.org/clojure_core/clojure.core/for。特别是显示:while
和{{1}}之间差异的部分。