Câu hỏi này xuất phát hoàn toàn từ "tinh thần trí tuệ" và có lẽ không có giá trị thực tiễn.Hằng số thời gian biên dịch Clojure
Nếu tôi xác định giá trị trong Clojure bằng cách sử dụng def
, trình biên dịch có thể được kích hoạt để đánh giá nó tại thời gian biên dịch hay không và chờ cho đến khi chạy đúng thời gian?
(def the-answer 42)
(+ the-answer 1)
Tôi đoán tôi có thể định nghĩa một macro, nhưng cú pháp gọi điện thoại trở thành loại lúng túng:
(defmacro the-answer [] 42)
(+ (the-answer) 1)
cũng trình này, nhưng vẫn còn xấu xí:
(+ `~the-answer 1)
Tôi cũng hiểu (hoặc tin rằng) Clojure đánh giá các biểu thức liên tục tại thời gian biên dịch:
(def milliseconds-per-day (* 24 60 60 1000))
Tôi chỉ học Common Lisp, nhưng sự hiểu biết của tôi là Common Lisp hỗ trợ người dùng định nghĩa macro đọc, vì vậy bạn có thể định nghĩa một macro đọc (cái gì đó như #$
) mà đánh giá các biểu tượng sau tại thời gian biên dịch:
(+ #$the-answer 1)
Nhân tiện, cú pháp đó không "đẹp hơn" so với cuộc gọi macro.
Làm cách nào để làm cho Clojure đánh giá các biến cố định tại thời gian biên dịch và thay thế tham chiếu bằng giá trị thực tế? Liệu nó đã làm như vậy?
Trước khi bất cứ ai bắt đầu trích dẫn Luật Knuth ("tối ưu hóa sớm là gốc rễ của tất cả điều ác"), tôi hỏi câu hỏi này để hiểu rõ hơn về nội bộ của trình biên dịch Clojure.
Đó không phải là những gì được thực hiện. Giáo hoàng là nói một cách hờ hững hoặc giáo điều. –
Vâng, tôi đã xóa nó. – Ralph