Clojure Record Konstruktoren nicht erste Klasse?

7

Anscheinend können Sie apply nicht mit einem Datensatzkonstruktor aufrufen:

%Vor%

schlägt beim Lesen fehl, weil Foo nicht erwartet wird. an diesem Ort.

Die einzige offensichtliche Problemumgehung, an die ich denken konnte, war, eine Factory-Funktion hinzuzufügen:

%Vor%

was natürlich angewendet werden kann.

Vermisse ich etwas? Ich würde dies von C # / Java erwarten, aber ich dachte nur, dass es in Clojure etwas enttäuschend war ...

    
Kurt Schelfthout 16.02.2011, 12:01
quelle

3 Antworten

10

Zurück auf diese Post-1.3 ....

In de Clojure 1.3 erstellt defrecord zwei generierte Konstruktorfunktionen. Gegeben:

%Vor%

Dies erzeugt eine Positionskonstruktorfunktion ->Person :

%Vor%

und eine Kartenkonstruktorfunktion map->Person :

%Vor%

Da dies eine Map ist, sind alle Schlüssel optional und nehmen im konstruierten Objekt einen Nullwert an.

Sie sollten diese Funktionen von der ns anfordern, in der Sie den Datensatz deklarieren, aber Sie müssen die Datensatzklasse nicht wie bei der Verwendung des Java-Klassenkonstruktors importieren.

Weitere Details:

Alex Miller 21.01.2012, 19:13
quelle
6

Foo. ist ein Java-Klassenkonstruktor, daher hat es typische Java-Interop-Einschränkungen, wie Sie es nennen. Das Erstellen einer Konstruktorfunktion ist eine gebräuchliche Lösung (es bedeutet auch, dass Sie das Foo nicht in einem anderen Namensraum importieren müssen).

    
Alex Miller 16.02.2011 13:51
quelle
3

Das Problem ist bekannt und auf der Clojure-Mailingliste wird viel darüber gesprochen. Weitere Unterstützung wird wahrscheinlich in zukünftigen Clojure-Versionen hinzugefügt werden.

Für jetzt müssen Sie Ihre eigenen Funktionen verwenden oder Ссылка verwenden, die einige Funktionen wie unterstützt:

  • in einer auswertbaren Form drucken
  • stellt Clojure-Funktion als Konstruktor zur Verfügung
  • akzeptiert benannte Parameter (Maps) im Konstruktor
  • Teilnahme an Pre / Post-Walk-Multi-Methode
nickik 16.02.2011 12:56
quelle

Tags und Links