Ich möchte eine Abstraktion erstellen, die eine Datenbanktabelle darstellt, auf die aber mit allen üblichen Clojure-Seq- und Conj-Programmen und all diesen tollen Dingen zugegriffen werden kann. Gibt es ein Protokoll, das ich hinzufügen muss?In Clojure wie kann ich standardmäßige Clojure-Collection-Schnittstellen auf meinen eigenen Datensätzen und Typen implementieren?
18
A
Antwort
15
Ja. Das Protokoll wird über die Java-Schnittstelle clojure.lang.ISeq
definiert. Sie möchten vielleicht clojure.lang.ASeq
erweitern, die eine abstrakte Implementierung davon bietet.
Hier ist ein Beispiel: eine seq
Abstraktion einer Ressource, die verschließbar ist und automatisch geschlossen wird, wenn die seq
endet. (Nicht streng getestet)
(deftype CloseableSeq [delegate-seq close-fn]
clojure.lang.ISeq
(next [this]
(if-let [n (next delegate-seq)]
(CloseableSeq. n close-fn)
(.close this)))
(first [this] (if-let [f (first delegate-seq)] f (.close this)))
(more [this] (if-let [n (next this)] n '()))
(cons [this obj] (CloseableSeq. (cons obj delegate-seq) close-fn))
(count [this] (count delegate-seq))
(empty [this] (CloseableSeq. '() close-fn))
(equiv [this obj] (= delegate-seq obj))
clojure.lang.Seqable
(seq [this] this)
java.io.Closeable
(close [this] (close-fn)))
Verwandte Themen
- 1. In Clojure wie kann ich meinen eigenen deftype refable machen?
- 2. Wie kann ich meinen benutzerdefinierten Validator auf Agular 2 implementieren?
- 3. Wie kann ich Pythons datetime.datetime mit meinen eigenen Methoden erweitern?
- 4. Kann ich Felder zu Clojure-Typen hinzufügen?
- 5. Wie erstelle ich meinen eigenen Encoder und Decoder in PHP
- 6. Wie kann ich meinen eigenen benutzerdefinierten Eigenschaftseditor für alle Instanzen eines bestimmten Typs implementieren?
- 7. Wie betreibe ich meinen eigenen Bower-Server?
- 8. Wie erstelle ich meinen eigenen Abmeldelink?
- 9. Ich mache meinen eigenen Schieberegler
- 10. Wie kann ich das XMPP-Protokoll für meinen eigenen Chat-Client implementieren?
- 11. Wie kann ich meinen eigenen Formular-Designer erstellen?
- 12. Wie erstelle ich meinen eigenen Peerjs Server?
- 13. Wie kann ich meinen eigenen VAST-fähigen Videoplayer bauen?
- 14. Wie kann ich meinen eigenen Konstruktor "stackwise_construct" erstellen?
- 15. Kann ich meinen eigenen Kurzschluss in einem Methodenaufruf erzwingen?
- 16. Implementieren Sie move semantics für meinen eigenen std :: vector
- 17. Wie erstelle und betreibe ich meinen eigenen Domain Name Server?
- 18. Ich habe meinen eigenen Logger in angular2
- 19. Wie schreibe ich meinen eigenen Wrapper in C#?
- 20. Wie mache ich meinen eigenen syntaktischen Zucker in Swift?
- 21. Wie überspringe ich die standardmäßige JavaScript-Array-Serialisierung für IEnumerable-Typen in Json.Net?
- 22. Wie konfiguriere ich meinen eigenen SMTP-Server in meinem System?
- 23. Wie bette ich meinen eigenen Videoplayer in Facebook ein?
- 24. Wie erstelle ich meinen eigenen ConfirmAjaxButton in Apache Wicket?
- 25. Wie kann ich die Django Admin-Liste und Filtering in meinen eigenen Ansichten verwenden?
- 26. Wie benutze ich meinen eigenen Klassifikator in ensemble python
- 27. Wie beziehen Sie sich in Clojure auf primitive Java-Typen?
- 28. Verweise auf meinen eigenen Datentyp im Klassenparameter
- 29. Clojure-Programm seines eigenen MANIFEST.MF
- 30. Wie kann ich die Lokalisierung mit .po/.mo-Dateien in meinen eigenen Anwendungen unterstützen?
Gibt es einen Grund, warum ein Vektor von Datensätzen als Darstellung nicht ausreicht? (Ich meine das als eine ernsthafte Frage, nicht Snark). Alle APIs von Closure würden mit einer solchen Abstraktion arbeiten. Aus clojures Begründung http://clojure.org/rationale - "Es ist besser, wenn 100 Funktionen auf einer Datenstruktur arbeiten, als 10 Funktionen auf 10 Datenstrukturen haben." - Alan J. Perlis –
Der Grund ist, dass, wenn ich ein Element zum Vektor hinzufügen möchte ich das Element automatisch in einem Datenspeicher beibehalten, und es gibt keine Möglichkeit, dass ich verstecken kann, ohne Con- oder Nachteile oder was auch immer die Add-Funktion ist für Vektoren. – Zubair
Sei super, super vorsichtig mit dieser Art von Dingen. Wenn deine DB nicht unveränderlich ist, lügst du im Grunde über deine Semantik zu Clojure, das kann sehr schnell schiefgehen. Der Großteil von Clojure basiert auf der Idee, dass Sammlungen unveränderlich sind. Daher werden viele Annahmen darüber getroffen, wie bestimmte Funktionen funktionieren. Zum Beispiel sollte die Verwendung von conj für eine Sammlung die Sammlung nicht ändern. Es sollte eine neue Sammlung zurückgeben. Das Brechen dieser Regel könnte bewirken, dass Clojures Funktionen auf sehr seltsame Weise fehlschlagen. –