2011-06-27 29 views
16

Cách chính xác để ghi đè phương thức như "+" là gì? Hiện tại, tôi cóclojure - cách chính xác để ghi đè cục bộ các toán tử như "+", "*", v.v.

(defn- + [x y] (replacement x y)) 

nhưng điều này dẫn đến cảnh báo trên dòng lệnh.

WARNING: + already refers to: #'clojure.core/+ in namespace: <MY-NAMESPACE>, being replaced by #'<MY-NAMESPACE>/+ 
+0

Để rõ ràng, đối với những người mới sử dụng Clojure, câu hỏi này không phải là 'ghi đè' theo nghĩa hướng đối tượng (Clojure không hướng đối tượng.) Thực sự câu hỏi đặt ra là làm thế nào để ngăn chặn cảnh báo được kích hoạt khi một var toàn cục được hồi phục. Ràng buộc đầu tiên xảy ra vì việc sử dụng macro 'ns' mang đến ánh xạ từ clojure.core. (xem http://clojure.org/namespaces) Ràng buộc thứ hai xảy ra khi một tệp cục bộ rebinds var. –

+0

Ngoài ra, thuật ngữ khác: Clojure không có phương pháp. Nó có chức năng. –

Trả lời

29

Bạn cần phải loại trừ các chức năng được nhập khẩu bởi cốt lõi:

(ns your-ns 
    (:refer-clojure :exclude [+ ...])) 

(defn + ...) 
3

Bạn có chắc chắn muốn thực hiện việc này không? Nếu có, bạn có thể sử dụng defprotocol để chỉ định toán tử nào bạn muốn ghi đè và mở rộng các lớp mà bạn muốn các ghi đè này được triển khai thực hiện. Đối với một (giả tạo) ví dụ xem tôi answer to this question.

+0

Vâng, tôi chắc chắn, tôi đang cố gắng viết một DSL. Giải pháp tốt đẹp, cảm ơn! – gatoatigrado

4

Mặc dù tôi không khuyên bạn nên trọng chức năng cốt lõi như +, bạn có thể sử dụng ràng buộc hoặc để cho điều này, nó phụ thuộc vào những gì bạn muốn hành vi:

(let [+ -] (redu­ce + [1 2 3])) ; -4 
(defn my-pl­us [x] (redu­ce + x)) 
(let [+ -] (my-p­lus [1 2 3])) ;6 
(binding [+ -] (my-p­lus [1 2 3])); -4 

Giống như nó đã được nói trong các ý kiến ​​dưới đây, ràng buộc không hoạt động theo cách này nữa kể từ clojure 1.3, kể từ khi var nên được năng động và +, -, vv không.

Vì mục đích thử nghiệm/chế nhạo, bạn có thể nhận được hành vi tương tự. Trong trường hợp đó nhìn vào với-redefs (kể từ clojure 1.3): http://clojuredocs.org/clojure_core/clojure.core/with-redefs

Xem thêm: Let vs. Binding in Clojure

+2

sẽ không hoạt động dưới clojure 1.3 - '+' không được đánh dấu là động và không thể bị ràng buộc lại – aav

+0

@aav - có thể đúng đối với ràng buộc, nhưng phiên bản cho phép vẫn hoạt động (vì cho là liên kết từ vựng) – mikera

+0

đồng ý - hãy làm việc – aav

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