2009-11-18 9 views
11

Hầu như 2 chương trình giống hệt nhau để tạo ra những hạn chế lười biếng vô hạn. Đầu tiên không bị hỏng. Tai nạn thứ hai với ngoại lệ OutOfMemoryError. Tại sao?Clojure: ma thuật lười biếng

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

Nhưng sự sụp đổ sau khá nhanh chóng:

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

Trả lời

23

Tôi tin rằng đây là một ví dụ về "tổ chức vào đầu".

Bằng cách làm cho tham chiếu r1 trong ví dụ thứ hai, bạn mở ra khả năng sau này nói điều gì đó như (first r1) để bạn sẽ lưu trữ các thành viên của lazy-seq của bạn khi chúng được thống nhất.

Trong trường hợp đầu tiên Clojure có thể xác định rằng sẽ không có gì được thực hiện với các thành viên trước đó của chuỗi vô hạn để chúng có thể được xử lý và không tiêu thụ bộ nhớ.

Tôi vẫn còn rất nhiều người mới bắt đầu bản thân Clojure, mọi nhận xét hoặc chỉnh sửa đối với sự hiểu biết hoặc thuật ngữ của tôi được đánh giá cao.

+0

Tôi cũng là người mới bắt đầu, nhưng lời giải thích của bạn trông rất chính xác. Tôi sẽ trả lời điều tương tự nếu bạn không đánh tôi với nó! Và 6 người tán thành dường như đồng ý với bạn. –

+0

Khi tôi bắt đầu thực hiện các vấn đề Dự án Euler trong Clojure một lúc trở lại, bản in gỡ lỗi của tôi trên các chuỗi lười vô hạn làm chậm các chương trình của tôi xuống ... vô hạn. Chuỗi vô hạn lười biếng là một khái niệm quan trọng của Clojure để hiểu thấu. –

+2

BTW, cách không có StackOverflow. Có một đệ quy vô hạn trong inf-rand – GabiMe