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?
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