2009-10-08 36 views
15

Thậm chí xem xét kỹ tài liệu về Clojure, tôi không thấy bất kỳ xác nhận nào trực tiếp về việc Clojure có hỗ trợ quá tải toán tử hay không.Quá tải nhà điều hành trong Clojure

Nếu có, ai đó có thể cung cấp cho tôi một đoạn trích nhanh về cách quá tải, giả sử toán tử "+" ủy quyền cho một số phương pháp được xác định trước mà chúng tôi có thể gọi myPlus.

Tôi là rất mới đối với Clojure, vì vậy, trợ giúp của ai đó tại đây sẽ được đánh giá cao.

Trả lời

23

Các toán tử của Clojure (như bất kỳ Lisp's) nào là hàm đồng bằng; bạn có thể xác định một "hành" như một chức năng:

(defn ** [x y] (Math/pow x y)) 

Các "+" nhà điều hành (và một số toán học-nhà khai thác khác) là một trường hợp đặc biệt trong Clojure, vì nó được inlined (đối với trường hợp nhị phân, ít nhất). Bạn có thể ở một mức độ nhất định tránh điều này bằng cách không đề cập đến clojure.core (hoặc loại trừ clojure.core/+) trong không gian tên của bạn, nhưng điều này có thể rất lông.

Để tạo một không gian tên nơi + được định nghĩa lại:

(ns my-ns 
    (:refer-clojure :exclude [+])) 

(defn + [x y] (println x y)) 

(+ "look" "ma") 

Một chiến lược tốt có lẽ sẽ làm cho bạn + một multimethod và gọi hàm + cốt lõi đối với các trường hợp số.

+0

Vì vậy, nếu tôi loại trừ clojure.core/+, tôi có thể thực hiện các thao tác sau (defn + [xy] (myPlus xy)) đúng không? Nếu vậy, đó chính là điều tôi muốn làm. Làm cách nào để loại trừ clojure.core/+ khỏi không gian tên của tôi? –

+0

Tôi đã thêm câu trả lời này vào câu trả lời của mình. – pmf

+0

Bingo, chính xác những gì tôi đang tìm kiếm! Cảm ơn. –

4

Hãy xem này: http://clojure.org/multimethods

Một số chức năng, như + là cốt lõi và không thể được định nghĩa lại.

Bạn có thể tạo một hàm mới và gọi hàm đó là ". +" Hoặc "! +", Ví dụ tương tự về mặt dễ đọc.

Sử dụng thông tin trong URL đa phương thức được bao gồm ở trên, bạn có thể tạo một hàm cho bạn biết. + Triển khai thực hiện nào.

+0

Bạn không trả lời câu hỏi của mình theo cách này hay cách khác. – chollida

+0

Tôi đã thêm thông tin. – z5h

+0

Các bản cập nhật thực sự giúp làm cho câu trả lời này trở nên tốt hơn! – chollida

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