2012-02-07 33 views
5

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 

Trả lời

10

Vấn đề đầu tiên là bạn đang kiểm tra siêu dữ liệu của 3.14. Sử dụng (meta (var pi)) để xem siêu dữ liệu của pi. Nếu bạn làm như vậy, bạn sẽ thấy rằng nó bao gồm :const true.

(defmacro defconst [const-name const-val] 
    `(def 
    ~(with-meta const-name 
     (assoc (meta const-name) :const true)) 
    ~const-val)) 

tái tạo chính xác các siêu dữ liệu và hiệu suất của ^:const (mã được chuyển thể từ nguồn defn-).

+0

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

+0

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

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