2010-11-21 33 views
7

Có cách nào để xác định macro mới dưới tên def trong Clojure không? Tôi defmacro chỉnh sửa phiên bản mới sau khi cố gắng :refer-clojure :exclude bản gốc, nhưng dù sao nó cũng sử dụng định nghĩa được tích hợp sẵn.Xác định lại "def" trong Clojure

Tôi đã cố gắng bật định nghĩa hàm kiểu Đề án ((def (f x y) ...)(defn f [x y] ...)) bằng cách sử dụng mã sau.

(defmacro def 
    [ id & others ] 
    (if (list? id) 
     `(defn ~(first id) [[email protected](rest id)] [email protected]) 
     `(def ~id [email protected]))) 

Trả lời

6

def không phải là macro, nó là một dạng đặc biệt. Nó thực hiện một biểu tượng vào không gian tên hiện tại. Bạn không thể xác định lại các biểu mẫu đặc biệt, nhưng ngay cả khi bạn có thể, bạn sẽ nhận được hành vi như thế nào?

Cách đơn giản nhất là viết macro define trên cơ sở defdefn. Nếu bạn muốn sử dụng def từ, bạn có thể viết một wrapper replace-my-def-with-normal-def xung quanh tất cả các mô-đun, tức là

(replace-my-def-with-normal-def 

    (def x 0) 
    (def y (inc x)) 
    (def z (inc y)) 
    (def (my-func a b) (println a b)) 

) 

nhưng tôi không chắc chắn nó sẽ không phá vỡ các định nghĩa khác, mà phụ thuộc vào def (ví dụ, defn).

+4

Bạn không thể xác định lại các biểu mẫu đặc biệt. –

2

Bạn có thể tạo macro bằng tên của biểu mẫu đặc biệt (như nếu), nhưng nó sẽ không giúp bạn. Các biểu mẫu đặc biệt được đánh giá trước macro, do đó nếu bạn có macro và một dạng đặc biệt cùng tên, biểu mẫu đặc biệt sẽ luôn được sử dụng. Thêm thông tin tại đây http://clojure.org/evaluation.

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