2010-06-17 13 views
5

Ich habe folgendes in einem Namensraum shapes sagen:Definieren von Clojure Multimethoden

(isa? ::square ::shape) 

kehren true:

(derive ::rect ::shape) 
(derive ::square ::rect) 

nun folgend im shapes Namespace ausgeführt wird. Aber wenn ich die folgenden in einem Namespace ausführen, wo ich tatsächlich Multimethoden für Zeichengerät,

(isa? ::square ::shape) 

kehrt false. Obwohl ich die richtigen MultiMethod-Versandfunktionen installiert habe, erhalte ich einen Fehler, der besagt, dass keine Versandfunktion gefunden wurde.

Fehle ich etwas? Das Implementieren aller Arten von Formen in einem riesigen Namensraum erscheint mir sinnlos.

Antwort

3

Es stellt sich heraus, :: verwendet den aktuellen Namespace, damit Typen von anderen Namespaces verwendet werden müssen, müssen Sie voll qualifizierte Namen verwenden wie: shapes/square.

0

Sie sind in Ihrer Selbstantwort korrekt, dass der Operator :: etwas im aktuellen Namespace findet.

Ein interessanter Punkt ist, dass die Schlüsselwörter Namespaced in jedem beliebigen Namespace sein können, auch wenn sie in keiner Datei deklariert sind. Wenn Ihr Namespace-Baum kompliziert ist und Sie bevorzugen: Geometrie/Quadrat, Geometrie/Kreis und Ähnliches, können Sie das einfach verwenden.

Vergessen Sie auch nicht, dass ableiten, underive (verwenden Sie nicht gerade jetzt), isa? und verwandte Funktionen können Sie eine unabhängige Hierarchie verwenden, wenn Sie möchten. Siehe When and how should independent hierarchies be used in clojure?

0

Sie können :: auch mit Namespace-Aliasen verwenden.

(ns some.other.package 
    (:require [some.terr.ibly.long.package.name :as short])) 

Jetzt: ::short/abc beziehen sich die gleichen sein wie :some.terr.ibly.long.package.name/abc

+0

Sollte dies nicht sein ': short/abc'? – amalloy

+0

Nein. Aber ich muss 12 weitere Zeichen eingeben. – kotarak

Verwandte Themen