6
(defn seq-trial 
    [] 
    (map #(do (println "hello " %) (inc %)) (range 10))) 

(take 3 (seq-trial)) 

예상대로 출력한다 평가 때 코드 snippt 상기 작동 다음 않는다 -게으름

(헬로 0 헬로 1 헬로 2 헬로 3 헬로 4 헬로 5 헬로 6 헬로 7 안녕하세요 8 안녕하세요 9 1 2 3)

지도 나는이 만 인쇄하는 데 예상 게으른 시퀀스를 반환하기 때문에 -

(헬로 0 헬로 1 개 헬로 2 1 2 3)

이유 목록 전체 여기서 평가?

답변

8

이것은 청킹이라는 성능 최적화 때문입니다. 본질적으로 시퀀스는 n 청크라는 항목으로 실현됩니다. 즉, 매핑 기능의 부작용에주의해야합니다. 최종 결과가 정확합니다. 올바른 길이의 시퀀스가 ​​반환됩니다.

기본 청크 크기는 32이므로 범위를 그보다 큰 값으로 늘리면 조금 더 나은 것을 이해할 수 있습니다.

user> (defn seq-trial 
    [] 
    (map #(do (println "hello " %) (inc %)) (range 100))) 

user> (take 3 (seq-trial)) 
hello 0 ; 32 item 'chunk' realized... 
hello 1 

... 

hello 30 
hello 31 
(1 2 3) ; the expected returned value 

당신은 혼합하지 마십시오 options available

+2

부작용과 게으른 평가가 청크 피할 필요합니다. –

관련 문제