Lassen Sie eine Java-Klasse als Sequenz in Clojure arbeiten

8

Ich verwende eine Java-Klasse, die eine Folge von Ergebnissen darstellt (etwa wie ein Clojure-Vektor).

Ich möchte diese Klasse mit den typischen Clojure-Sequenzfunktionen verwenden (dh ich möchte, dass die Klasse sich so verhält, als würde sie die Sequenzabstraktion unterstützen), aber ich kann die Klasse nicht ändern unfähig, clojure.lang.Seqable oder ähnliches zu implementieren. Ärgerlicherweise implementiert die Klasse auch nicht java.util.Collection oder java.lang.Iterable .

Ich kann ein paar Optionen sehen:

  • Verwenden Sie iterator-seq für den (vorhandenen) Iterator des Objekts.
  • Umbrechen Sie das Objekt in eine andere Klasse, die java.util.Collection / clojure.lang.Sequable implementiert.
  • Erstellen Sie eine Funktion, die einen Clojure-Vektor oder eine Clojure-Sequenz erstellt, indem Sie das Objekt
  • abfragen

Gibt es noch andere Möglichkeiten? Was ist der beste Ansatz?

    
mikera 19.10.2012, 01:15
quelle

3 Antworten

6

Am schnellsten und einfachsten wäre es, iterator-seq zu verwenden.

Das wirft die Frage auf: Warum stellt Core Clojure kein Protokoll wie SeqSource zur Verfügung, das von seq aufgerufen würde? Dann könnten Nicht-Standard-Sammlungen "erweitert" werden, um einen Seq zu liefern, ähnlich wie der InterneReduce für reduce funktioniert.

    
M Smith 19.10.2012, 03:31
quelle
6

Verwenden Sie proxy , um die Klasse zu erweitern und um% zu implementieren. co_de%

    
noahlz 19.10.2012 06:24
quelle
2

Mein erster Screenshot wäre die Erstellung eines Lazy-seq des Objekts:

%Vor%

Ersetzen Sie einfach .size und .get durch geeignete Methoden.

Das Schreiben eines Wrappers ist möglicherweise sinnvoller, wenn Sie die Leistung im Vergleich zu lazy-seq solution verbessern möchten.

    
Ivan Koblik 19.10.2012 12:30
quelle