2009-10-08 13 views
15

Nawet uważnie przyglądając się dokumentacji dotyczącej Clojure, nie widzę żadnego potwierdzenia, czy Clojure obsługuje przeciążanie operatora.Przeciążenie operatora w Clojure

Jeśli tak, to czy ktoś mógłby mi podać szybki sposób na przeciążenie, powiedzmy, operator "+", aby przekazać pewne predefiniowane metody, które możemy nazwać myPlus.

Jestem bardzo nowy dla Clojure, więc ktoś tu pomoże bardzo mile widziane.

Odpowiedz

23

Operatory Clojure (jak każdy Lisp) są funkcjami prostymi; można zdefiniować „operator” jak funkcja:

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

Znak „+” operator (i niektóre inne matematyczne-operatorzy) jest szczególnym przypadkiem w Clojure, ponieważ jest inlined (dla przypadku binarnego, co najmniej). Możesz w pewnym stopniu tego uniknąć, nie odwołując się do clojure.core (lub wykluczając clojure.core/+) w swojej przestrzeni nazw, ale to może być bardzo owłosione.

Aby utworzyć nazw gdzie + jest przedefiniowana:

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

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

(+ "look" "ma") 

Jedna dobra strategia byłaby prawdopodobnie dokonać + a multimethod i wywołać funkcję rdzenia + przypadków liczbowych.

+0

Gdybym miał wykluczyć clojure.core/+, mógłbym wykonać następujące czynności (defn + [xy] (myPlus xy)) jest poprawny? Jeśli tak, to właśnie chcę zrobić. Jak wykluczyć clojure.core/+ z mojej przestrzeni nazw? –

+0

Dodałem to do mojej odpowiedzi. – pmf

+0

Bingo, dokładnie to, czego szukam! Dzięki. –

4

Spójrz na to: http://clojure.org/multimethods

Niektóre funkcje, takie jak + to rdzeń i nie można zmienić.

Można utworzyć nową funkcję i nazwać ją na przykład ". +" Lub "! +", Co jest podobne pod względem czytelności.

Korzystając z informacji zawartych w podanym powyżej adresie multimethods, możesz zbudować funkcję, która podpowie Twoją. + Której implementacji użyć.

+0

Nie odpowiedziałeś na jego pytanie w ten czy w inny sposób. – chollida

+0

Dodałem więcej informacji. – z5h

+0

Dzięki aktualizacjom ta odpowiedź jest lepsza! – chollida

Powiązane problemy