我一直在学习的Clojure和不解以下内容:困惑:Clojure for循环:while - >意外行为?
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_
让我们添加: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!_
更改: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_
任何人都可以解释为什么(for [ ... :while ..] ...)
的行为也是这样吗?
我使用Clojure的1.3 OS X.
谢谢你,为缺乏格式化的道歉。这是我在StackOverflow上的处女帖子。
谢谢尼基塔。所以如果:只适用于内部循环,我如何使它适用于外部循环?我遇到的问题是:[for [from [:a:b:c:d:e:f] to [:a:b:c:d:e:f]:let [path(find-path ab)]] :while path)path);当路径为零时,循环应该停止。 – jbear 2012-01-11 11:30:32
对不起,我的意思是 (for [from [:a:b:c:d:e:f] to [:a:b:c:d:e:f]:let [path(find-path from to) ]:while path] path) – jbear 2012-01-11 11:40:33
@jbear,我不知道:(可能是你最好创建懒惰seq的路径,并采取,而他们不是null。我不确定'for'是懒惰。 – 2012-01-11 14:27:54