Tôi đang cố gắng để xác định một macro để xác định hằng số thời gian biên dịch cú pháp mà đã được bổ sung trong Clojure 1.3:nét liên tục trong Clojure
== 2.14 ^: const defs ==
^: const cho phép bạn đặt tên các giá trị nguyên thủy với tham chiếu nhanh hơn.
(def hằng {: pi 3.14: Địa chỉ e 2,71})
(def ^: const pi (: hằng số pi)) (def ^: const e (: e hằng))
Các overhead tra cứu: e và: pi trong bản đồ xảy ra tại thời gian biên dịch , như (: hằng số pi) và (: hằng số) được đánh giá khi các biểu mẫu lỗi gốc của chúng được đánh giá là .
Về cơ bản tôi muốn có một số đường cú pháp xung quanh (def ^:const ... ...)
, vì vậy tôi đang cố gắng để làm điều đó như thế này:
(defmacro defconst [const-name const-val]
`(def ^:const ~const-name ~const-val))
Nhưng điều này không làm việc:
user=> (macroexpand '(defconst pi 3.14))
(def pi 3.14)
Từ những gì tôi thu thập phím tắt #^<...>
là macro trình đọc và để xác định macro thêm siêu dữ liệu vào thứ gì đó, bạn nên sử dụng (with-meta ...)
.
Tôi chưa tìm thấy bất kỳ tài liệu nào về số ^:const
. Điều này có cấu tạo cú pháp thậm chí tạo ra một số loại siêu dữ liệu không? Ví dụ sau không hiển thị bất kỳ:
user=> (def ^:const pi 3.14)
#'user/pi
user=> (meta pi)
nil
Cảm ơn câu trả lời. Tôi đã kiểm tra bằng cách thực hiện '(thời gian (dấu chấm [_ 1e10] (* pi pi)))' vs '(thời gian (dấu chấm [_ 1e10] (* 3.14 3.14)))' và nó tính cùng một thời gian thực hiện. – MisterMetaphor
Thú vị. Tôi đã bỏ lỡ điểm 'const' - tôi đã không bắt được' const' "vars" để tìm kiếm hiệu quả hơn. Bây giờ chúng có ý nghĩa hơn nhiều. – Retief