Deseo crear una abstracción que represente una tabla de base de datos, pero a la que se pueda acceder utilizando todas las funciones y conjunciones habituales de Clojure y todas esas cosas elegantes. ¿Hay algún protocolo que deba agregar?En Clojure, ¿cómo puedo implementar interfaces de recopilación Clojure estándar en mis propios registros y tipos?
18
A
Respuesta
15
Sí. El protocolo está definido por la interfaz Java clojure.lang.ISeq
. Es posible que desee extender clojure.lang.ASeq
que proporciona una implementación abstracta de la misma.
Aquí hay un ejemplo: una abstracción seq
de un recurso que se puede cerrar y se cierra automáticamente cuando termina seq
. (No se probó rigurosamente)
(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)))
Cuestiones relacionadas
- 1. Igualación de mapas y registros en Clojure
- 2. Tipos anidados en clojure?
- 3. Sincronización de la salida estándar en Clojure
- 4. Estándar para Clojure?
- 5. Cómo implementar un bucle en Clojure
- 6. ¿Debo implementar la interfaz Sec en clojure
- 7. Clojure tipos de datos algebraicos
- 8. no pueden importar registros clojure
- 9. ¿Cómo puedo sandbox Clojure?
- 10. ¿Puedo hacer mis propios guardias en Erlang?
- 11. ¿Funciones abstractas o interfaces de funciones en Clojure?
- 12. ¿Es posible hacer herencia de tipos de datos en Clojure?
- 13. patrón para implementar deshacer/rehacer en clojure
- 14. Ampliación (no implementación) de las interfaces Java en Clojure
- 15. = y == en Clojure
- 16. ¿Cómo puedo lanzar una excepción en Clojure?
- 17. ¿Cómo realizo la Conversión de tipos en Clojure?
- 18. Clojure estándar REPL con editor de búfer?
- 19. ¿Cómo puedo mapear una macro en Clojure?
- 20. Atributos de metadatos estándar de Clojure
- 21. ¿Cómo puedo definir una función en Clojure?
- 22. En Clojure, ¿cuándo deberían representarse los árboles de tipos de nodo heterogéneos utilizando registros o vectores?
- 23. ¿Cómo se pueden implementar las claves compuestas en clojure?
- 24. ¿Puedo agregar campos a los tipos de clojure?
- 25. ¿Cómo implementar lambda como una función llamada "lambda" en Clojure?
- 26. bloques iterador en Clojure?
- 27. ¿Cómo usar mis propias versiones de las bibliotecas de Clojure?
- 28. ¿Cómo puedo extender datetime.datetime de Python con mis propios métodos?
- 29. búsqueda XML en Clojure
- 30. Interoperación de clojure a con API iterativa no estándar API
¿Hay alguna razón por la que un vector de registros sea insuficiente como representación? (Me refiero a esto como una pregunta seria, no sarcástica). Toda la API de cierre funcionaría con una abstracción de este tipo. De la lógica de clojure http://clojure.org/rationale - "Es mejor tener 100 funciones operando en una estructura de datos que tener 10 funciones operando en 10 estructuras de datos". - Alan J. Perlis –
La razón es que cuando agrego un elemento al vector quiero que el elemento se mantenga automáticamente en un almacén de datos, y no hay manera de que pueda ocultarlo sin volver a implementar conj o contras o lo que sea que la función de agregar sea para Vectores. – Zubair
Sé super, súper cuidadoso con este tipo de cosas. Si DB no es inmutable, básicamente estás mintiendo acerca de tu semántica a Clojure, esto puede salir mal muy rápidamente. La mayor parte de Clojure se basa en la idea de que las colecciones son inmutables. Como tal, se hacen muchas suposiciones sobre el desempeño de ciertas funciones. Por ejemplo, usar conj en una colección no debería cambiar la colección. Debería devolver una nueva colección. Romper esta regla podría causar que las funciones de Clojure fallen de maneras muy extrañas. –