2011-06-19 6 views
6

Quiero implementar transient y persistent! en mi deflector Clojure. Por lo que puedo decir, esto significa tener otro deftype, TransientMyThing, implementar los métodos necesarios. Está bien hasta ahora, pero esas dos clases necesitan conocerse para poder devolver instancias entre ellas.Defypes de referencia mutua en Clojure

Creo que puedo hacerlo declarando las funciones de Clojure make-transient y make-persistent, luego definiendo el deftype (refiriéndome a esa función), luego implementando las funciones con los tipos existentes, pero parece bastante bruto para mí. ¿Hay alguna opción mejor?

Editar: eso funciona, pero sigue siendo asqueroso.

+0

no se puede probar ahora pero pero podría ser posible agregar la funcionalidad después de haber definido los dos tipos con "extender-tipo"? – mikera

+4

Actualmente, no hay otra opción que la declaración directa de las funciones auxiliares. No creo que incurra en una penalización notable en el rendimiento (especialmente en 1.3). Sin embargo, hay otra cosa que puede funcionar: definir el tipo transitorio con reify dentro del método asTransient. No lo hice, pero hay buenas posibilidades de que aciertes a otra limitación del compilador (si el seguimiento de la pila habla de un apéndice, esa es la) . – cgrand

+0

El comentario de cgrand fue perfecto. Lo aceptaría si fuera una respuesta; simplemente agregando un comentario aquí para que cualquiera que se encuentre con la pregunta sepa cómo resolverlo. – amalloy

Respuesta

4

En Clojure 1.3 y posterior, una solución un poco más simple es confiar en las funciones de constructor que Clojure crea para sus deftypes, -> transitorios y -> persistentes !. Como esas son funciones, y no macros, puede reenviarlas. Entonces puede usarlos, en lugar de su propio make-transient y make-persistent, y no tiene que implementarlos usted mismo.

Cuestiones relacionadas