2010-05-31 27 views
17

Tôi đang tìm kiếm thông qua một số ví dụ Fibonacci Code Sequence clojure:Whats điểm của lazy-seq trong clojure?

(def fibs (lazy-cat [1 2] (map + fibs (rest fibs)))) 

tôi thường hiểu những gì đang xảy ra, nhưng không nhận được điểm lazy-cat. Tôi biết rằng lazy-cat là một macro được dịch một cái gì đó như thế này:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 

gì chính xác là lazy-seq hoàn thành? Nó vẫn sẽ được đánh giá uể oải ngay cả khi không có lazy-seq? Điều này có đúng với mục đích lưu vào bộ nhớ cache không?

EDIT: Cảm ơn câu trả lời. Sự nhầm lẫn của tôi là nó làm việc với một đồng bằng concat từ REPL bởi vì tôi đã có một ràng buộc trước đó để fibs trong phạm vi.

Trả lời

16

lazy-seq trên [1 2] là không cần thiết, nhưng không thực sự bị tổn thương.

lazy-seq trên (map + fibs (rest fibs)) là điều cần thiết; nếu không có nó, cuộc gọi hàm sẽ được đánh giá trước khi fibs bị ràng buộc với một giá trị, điều này sẽ gây ra một ngoại lệ. Bằng cách gói nó trong lazy-seq, cuộc gọi sẽ được hoãn lại cho đến khi giá trị là cần thiết và fibs sẽ có giá trị tại thời điểm đó.

7

Theo tôi được biết (và tôi thừa nhận vẫn là một gương mặt mới so với Clojure!), Nếu bạn thử như sau:

(def fibs (concat [1 2] (map + fibs (rest fibs)))) 

Sau đó, nó sẽ không làm việc vì fibs chưa bị ràng buộc và do đó hai tham chiếu sau này không thành công.

Phiên bản lười mà bạn cung cấp sẽ hoạt động, vì tham chiếu đến fib chỉ thực sự được giải quyết sau này khi chuỗi được tiêu thụ - và theo đó điểm fibs đã được định nghĩa thành công là chuỗi lười.

Các vấn đề liên quan