2013-04-10 61 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)) 
相關問題