2014-02-20 1 views
0

게으른 함수 시퀀스를 강제 평가하는 방법을 궁금합니다.게으른 함수 시퀀스 실행

예를 들어 나는 정수 1 반환하는 함수가있는 경우 :

test.core=> (fn [] 1) 
#<core$eval2480$fn__2481 [email protected]> 
test.core=> ((fn [] 1)) 
1 

을 그리고 이러한 기능의 게으른 시퀀스 구성 :

test.core=> (repeat 5 (fn [] 1)) 
(#<core$eval2488$fn__2489 [email protected]> ...) 

test.core=> (class (repeat 5 '(fn [] 1))) 
clojure.lang.LazySeq 

내가 실제로의 기능을 수행 할 어떻게 순서?

test.core=> (take 1 (repeat 5 (fn [] 1))) 
(#<core$eval2492$fn__2493 [email protected]>) 

test.core=> (take 1 (repeat 5 '(fn [] 1))) 
((fn [] 1)) 

test.core=> ((take 1 (repeat 5 '(fn [] 1)))) 

ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.IFn 

나는 DOALL을 제안하는 How to convert lazy sequence to non-lazy in Clojure 통해 읽었습니다 ...하지만 나는 결과가 어디로 가는지 모르겠어요? 나는 [1 1 1 1 1] 또는 비슷한 것을 기대하고있다.

test.core=> (doall (repeat 5 (fn [] 1))) 
(#<core$eval2500$fn__2501 [email protected]>...) 

test.core=> (realized? (doall (repeat 5 (fn [] 1)))) 
true 

답변

3

문제는 평가되지 않은 함수의 시퀀스를 반환한다는 것입니다.

=> (map #(%) (repeat 5 (fn [] 1))) 
(1 1 1 1 1) 

모두 maprepeat 게으른 있지만 REPL 또는 기타 소비자가 필요로 게으른 시퀀스의 적어도만큼의 평가를 강제로 다음과 같이 당신이 그들을 평가할 수 있습니다.

+1

그리고 시퀀스 청킹 (chunking)은 32 청크로 평가 될 것입니다. –

+1

청크 시퀀스를 생성하는 함수 ('repeat'는 생성하지 않습니다)에 대해서만. Chunking은 때로는 중요하지만 OP가 함수 목록을 호출하는 방법을 찾은 후에도 무시해도됩니다. – amalloy