2013-04-10 2 views

답변

3

무한 시퀀스를 REPL에 인쇄하여 평가하려고하기 때문에.

예 : (filter #(> % 100) (iterate #(+ % 17) 0))은 REPL이 결과 시퀀스의 첫 번째 x 요소 다음에 ...을 인쇄하기 때문에 REPL에 인쇄 할 수 있습니다. x(set! *print-length* x)으로 설정할 수있는 값입니다.

그러나 가능한 한 6 가지 요소 만 있으므로 (filter #(< % 100) (iterate #(+ % 17) 0))을 (를) 평가하려고하면 영원히 실행됩니다. 당신이 iterate로 만드는 순서가 이미 정렬되어 있기 때문에

;; 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 ...) 

당신은 대신 filtertake-while을 사용할 수 있습니다 :


*print-length* 문서에서보세요. 그것은 "무한"이기 때문에, 그러나 100 이하이다 시퀀스에서만 3 개의 숫자가 있습니다

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

인쇄. 그 길이가 * print-length *보다 작기 때문에? 이상한가요? – yehe

+1

여기에 유한 시퀀스가 ​​없으며 반복이 무한하며 무한 시퀀스에서 필터를 실행하면 무한 시퀀스가됩니다. – Ankur

+1

* 길이가 인쇄 길이보다 작습니까? * REPL은 첫 번째'x' 요소를 얻으려고합니다. REPL에 대해 요소를 가져 오는 데 걸리는 시간 또는 가능한 경우 REPL을 알 수있는 방법이 없습니다. 또한, 당신의 시퀀스가 ​​유한하지 않습니다. – sloth

0

위의 표현식에서 볼 수 있듯이 인쇄 된 시퀀스는 완전한 결과가 아닙니다 (시퀀스 끝에서 ... 확인). 이는 시퀀스의 응답을 반환 할 때 nrepl을 나타냅니다. take 시퀀스에 더 많은 것이 있음을 나타 내기 위해 ...를 사용하여 인쇄하십시오. 마지막 케이스에서 "100 미만의 숫자"는 인쇄에 nrepl에 필요한 최소 항목 수를 생성하지 않으므로 nrepl은 시퀀스의 항목을 더 기다리게됩니다 (반복 횟수는 무한대입니다)

0

, filter는 네 번째 요소가 존재하지 않는 것을 결정하는 요소의 "무한"수를 봐야한다 .

귀하의 예를 iterate 구조가 증가 시퀀스를 생성하기 때문에 당신은 예를 들어 100보다 작은 요소로 결과를 제한하려는 경우, 당신은 take-while을 사용할 수

(take-while #(< % 100) (iterate #(+ % 17) 0)) 
유한 결과가되지 않습니다 왜 요구했다
관련 문제