17 Stimmen

Operator-Überladung in Clojure

Selbst wenn ich mir die Dokumentation zu Clojure genau ansehe, finde ich keine direkt Bestätigung, ob Clojure Operator-Überladung unterstützt oder nicht.

Wenn ja, könnte mir jemand ein kurzes Snipplet zeigen, wie man den "+"-Operator überladen kann, um eine vordefinierte Methode zu delegieren, die wir aufrufen können myPlus .

Ich bin sehr neu in Clojure, so dass jemand Hilfe hier sehr geschätzt werden würde.

26voto

pmf Punkte 7438

Die Operatoren von Clojure (wie auch die von Lisp) sind einfache Funktionen; Sie können einen "Operator" wie eine Funktion definieren:

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

Der "+"-Operator (und einige andere mathematische Operatoren) ist ein Sonderfall in Clojure, da er inlined ist (zumindest für den binären Fall). Sie können dies bis zu einem gewissen Grad vermeiden, indem Sie sich nicht auf clojure.core (oder ohne clojure.core/+ ) in Ihrem Namespace, aber das kann sehr haarig sein.

So erstellen Sie einen Namensraum, in dem + neu definiert wird:

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

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

(+ "look" "ma")

Eine gute Strategie wäre wahrscheinlich, Ihre + eine Multimethode zu machen und die + Funktion von core für die numerischen Fälle aufzurufen.

0 Stimmen

Wenn ich also clojure.core/+ ausschließen würde, könnte ich folgendes tun (defn + [x y] (myPlus x y)), richtig? Wenn ja, ist das genau das, was ich tun möchte. Wie schließe ich clojure.core/+ aus meinem Namespace aus?

1 Stimmen

Ich habe dies zu meiner Antwort hinzugefügt.

0 Stimmen

Bingo, genau das, wonach ich gesucht habe! Danke!

5voto

Mark Bolusmjak Punkte 22696

Schauen Sie sich das an: http://clojure.org/multimethods

Bestimmte Funktionen, wie z. B. +, sind Kernfunktionen und können nicht neu definiert werden.

Sie könnten eine neue Funktion erstellen und sie z. B. ".+" oder "!+" nennen, was im Hinblick auf die Lesbarkeit ähnlich ist.

Anhand der Informationen in der oben angegebenen Multimethoden-URL können Sie eine Funktion erstellen, die Ihrer .+ mitteilt, welche Implementierung zu verwenden ist.

0 Stimmen

Sie haben seine Frage weder in die eine noch in die andere Richtung beantwortet.

0 Stimmen

+ kann leicht in einem anderen Namensraum umdefiniert werden. Tatsächlich können Sie sogar umdefinieren + in clojure.core, wenn Sie möchten (obwohl nicht empfohlen....)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X