2009-11-18 3 views
11

무한한 lazy seqs of randoms를 생성하는 거의 동일한 프로그램 2 개. 첫 번째 충돌이 발생하지 않습니다. 두 번째 충돌은 OutOfMemoryError 예외입니다. 왜?Clojure : 게으른 마법

;Return infinite lazy sequence of random numbers  
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))  

;Never returns. Burns the CPU but won't crash and lives forever.  
(last (inf-rand)) 

는하지만 꽤 빨리 다음 충돌 :

;Return infinite lazy sequence of random numbers  
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))  
(def r1 (inf-rand)) 

;Crash with "OutOfMemoryError" 
(last r1) 

답변

23

나는이 "머리 잡고"의 예입니다 생각합니다.

두 번째 예에서 참조 r1을 작성하면 나중에 (first r1)과 같은 내용이 표시 될 수 있기 때문에 lazy-seq의 구성원을 구체화 할 때 저장하게됩니다.

첫 번째 경우 Clojure는 무한 시퀀스의 이전 멤버로 수행 할 작업이 없으므로 메모리를 삭제하고 처리하지 않을 수 있습니다.

나는 Clojure 초급자이며, 내 이해 또는 용어에 대한 의견이나 수정 사항을 크게 높이 평가합니다.

+0

저는 초보자입니다. 그러나 당신의 설명은 매우 정확합니다. 네가 나를 때리지 않았다면 나는 똑같은 대답을했을 것이다! 그리고 6 명의 승자가 당신과 동의하는 것 같습니다. –

+0

Clojure에서 Project Euler 문제를 잠시 쉬기 시작했을 때, 무한한 지연 시퀀스에 대한 디버그 인쇄물로 인해 프로그램이 느려지 게되었습니다. 무한한 게으른 시퀀스는 Clojure의 중요한 개념으로 이해할 수 있습니다. –

+2

BTW, 어떻게 StackOverflow 없습니다. inf-rand에는 무한 재귀가 있습니다. – GabiMe