문제

무한한 게으른 seq를 생성하기위한 거의 2 개의 동일한 프로그램. 첫 번째는 충돌하지 않습니다. OutofMemoryError 예외와 함께 두 번째 충돌. 왜요?

;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)
도움이 되었습니까?

해결책

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

두 번째 예제에서 참조 R1을 만들면 나중에 다음과 같은 말을 할 가능성이 있습니다. (first r1) 따라서 게으른 세Q 회원이 재건 될 때 저장하게됩니다.

첫 번째 경우 Clojure는 무한 시퀀스의 초기 구성원과 아무것도 수행하지 않을 것이라고 결정할 수 있으므로 메모리를 폐기하고 소비 할 수 없습니다.

나는 여전히 Clojure 초보자이며, 내 이해 나 용어에 대한 의견이나 수정은 크게 감사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top