Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 使用列表进行理解会返回意外的结果_Clojure_List Comprehension - Fatal编程技术网

Clojure 使用列表进行理解会返回意外的结果

Clojure 使用列表进行理解会返回意外的结果,clojure,list-comprehension,Clojure,List Comprehension,所以我试试这个代码 (for [x (range 1 8) y (range 1 8) :while (and (< x y) (even? x))] [x y]) (对于[x(范围18)y(范围18):while(和(

所以我试试这个代码

(for [x (range 1 8) y (range 1 8) :while (and (< x y) (even? x))] [x y])
(对于[x(范围18)y(范围18):while(和(
然后回来()

但我试着这样做:

(for [x (range 1 8) y (range 1 8) :while (and (< y x) (even? x))] [x y])
(对于[x(范围18)y(范围18):while(和(
我得到了想要的结果。 改变x和y的位置有什么影响?第一个代码段不应返回空列表。。毕竟在Clojure中必须有一些比y小的偶数x

(对于[x(范围18)y(范围18)][xy])
返回
x
y
的笛卡尔积,其中
y
对于
x
的每次迭代都从
1
运行到
7

从REP:

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
为奇数时运行循环,然后中断

因此,在第一个示例中,
:当
y
等于
1
时,
y
上的每次迭代中都会中断,因为
(和(x
的值

另一方面,您的第二个示例之所以有效,是因为即使
:虽然
y
的第一次迭代中中断,因为
(<11)
产生
y
的第二次迭代成功,因为
x
2
开始,所以如果
y
1
,并且
(和(
(和(<12)(偶数?2))
,其计算结果为
true


有关更多详细信息,请参阅。尤其是显示
:when
:while

之间差异的部分
:while
不绑定到整个
结构,只绑定到在
y
上迭代的部分,然后在每次
x
增加时重新启动。有关更多详细信息,请参阅我的答案。另请参阅并查看演示
:when
:while
之间差异的部分。