2013-04-10 91 views

回答

3

因为您正在尝试评估无限序列(通过将其打印到REPL)。

例如, (filter #(> % 100) (iterate #(+ % 17) 0))可以打印到REPL,因为REPL将打印结果序列的第一个x元素,然后是...,其中x是可以使用(set! *print-length* x)设置的值。

但试图评估(filter #(< % 100) (iterate #(+ % 17) 0))将永远运行,因为只有6个可能的元素。


看一看的*print-length*文档:

;; Oops! Don't this!!! 
user=> (iterate inc 0) 
;; Frantically doing C-c C-c :-P 
; Evaluation aborted. 

user=> (set! *print-length* 10) 
10 

;; Now it's perfectly fine. Yay! 
user=> (iterate inc 0) 
(0 1 2 3 4 5 6 7 8 9 ...) 

您可能需要使用take-while代替filter,因为你与iterate创建序列已经订购。

user=> (take-while #(< % 100) (iterate #(+ % 17) 0)) 
(0 17 34 51 68 85) 
+0

我问为什么有限效果不会打印出来。仅仅因为它的长度小于* print-length *?这是不是很奇怪? – yehe 2013-04-10 07:14:30

+1

这里没有有限的序列,迭代是无限的,无限序列上运行的滤波器会导致无限序列。 – Ankur 2013-04-10 07:16:31

+1

*仅仅因为它的长度小于打印长度* * REPL只是试图获得第一个'x'元素。没有办法知道REPL需要多少时间来获取这些元素,或者根本没有可能。另外,你的序列不是有限的。 – sloth 2013-04-10 07:17:07

0

如上面的表达式所示响应打印的序列不是完整的结果(检查序列末尾的...),这表明nrepl在返回序列的响应时take特定数量的项目来自序列并用...打印它们以表示序列中还有更多。在最后一种情况下,“小于100的数字”不会产生nrepl打印所需的最少数量的项目,因此nrepl会继续等待序列中的更多项目(这是迭代的无限序列)

0

有3只在您的序列号是小于100。然而,既然是“无限的”,filter必须看元素的“无限”号来确定第四元素不存在。

因为你的榜样iterate结构产生递增序列,可以使用take-while如果你要的结果限制为小于100的元素例如:

(take-while #(< % 100) (iterate #(+ % 17) 0)) 
相关问题