2010-06-12 37 views
12

Tôi đang gặp sự cố khi hiểu cách hoạt động của macro delay ở Clojure. Nó dường như không làm những gì mong đợi nó để làm (đó là: trì hoãn đánh giá). Như bạn có thể thấy trong mẫu mã này:Đánh giá bị trì hoãn ở Clojure

; returns the current time 
(defn get-timestamp [] (System/currentTimeMillis)) 

; var should contain the current timestamp after calling "force" 
(def current-time (delay (get-timestamp))) 

Tuy nhiên, gọi current-time trong REPL xuất hiện để đánh giá ngay lập tức biểu hiện, ngay cả khi không có sử dụng force vĩ mô:

user=> current-time 
#<[email protected]: 1276376485859> 
user=> (force current-time) 
1276376485859 

Tại sao là việc thẩm định get-timestamp không bị trì hoãn cho đến khi cuộc gọi force đầu tiên?

+1

nhận xét nhỏ: tốt hơn nên sử dụng (System/currentTimeMillis) trực tiếp thay vì xây dựng ngày - chúng sử dụng cùng một nguồn mili giây cơ bản nhưng trước đây tránh phân bổ đối tượng không cần thiết. – mikera

Trả lời

13

Đại diện được in của các đối tượng khác nhau xuất hiện tại REPL là sản phẩm của một đa phương thức có tên là print-method. Nó nằm trong tệp core_print.clj trong các nguồn của Clojure, cấu thành một phần của những gì nằm trong không gian tên clojure.core.

Vấn đề ở đây là đối với các đối tượng thực hiện clojure.lang.IDeref - giao diện Java cho mọi thứ deref/@ có thể hoạt động trên - print-method bao gồm giá trị phía sau đối tượng trong đại diện được in. Để kết thúc này, nó cần phải deref đối tượng và mặc dù các quy định đặc biệt được thực hiện để in Đại lý không thành công và tương lai đang chờ xử lý, Sự chậm trễ luôn bị buộc.

Thực ra tôi có xu hướng xem xét lỗi này hoặc tốt nhất là cần cải thiện. Để giải quyết sự cố hiện tại, hãy cẩn thận không in các sự chậm trễ không được thực hiện.

+0

Dĩ nhiên tôi sẽ cố gắng cải tiến. Nó sẽ khá đơn giản. –

+4

Tôi đoán Nguyên tắc Heisenberg cũng áp dụng cho clojure: bạn không thể quan sát sự chậm trễ mà không thay đổi nó. :-) – Greg

+0

@Greg: Tôi nghĩ bạn có nghĩa là Hiệu ứng Observer. :) https://en.wikipedia.org/wiki/Observer_effect_(physics)#Quantum_mechanics – Peeja

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