Estoy trabajando en algunos códigos Clojure que tienen algunas dependencias circulares entre diferentes espacios de nombres y estoy tratando de encontrar la mejor manera de resolverlos.Resolviendo las dependencias circulares de Clojure
- problema básico es que me sale un "No existe tal var: espacio de nombres/functionname" error en uno de los archivos
- he tratado de "declarar" la función, pero luego se queja con: "No se puede hacer referencia a una var calificada que no existe "
- Podría, por supuesto, refactorizar toda la base de código, pero parece poco práctico hacerlo cada vez que tenga una dependencia para resolver ..... y podría ser muy desagradable para ciertas redes de circular dependencias
- Podría separar un montón de interfaces/protocolos/declaraciones en un archivo separado y hacer que todo se refiera a eso .... pero parece que eso d terminé desordenado y arruiné la agradable estructura modular actual que tengo con funcionalidades relacionadas agrupadas juntas
¿Alguna idea? ¿Cuál es la mejor forma de manejar este tipo de dependencia circular en Clojure?
¡Gracias a Michal por la información y el trasfondo útil! Todavía no estoy convencido de que evitar las dependencias circulares sea necesariamente la mejor opción de diseño para la estructuración de proyectos. Echaré un vistazo al grupo de Clojure y veré si eso puede convencerme de lo contrario :-) – mikera
Una pequeña actualización: poner los protocolos en su propio espacio de nombres ha funcionado bien y solucionó la mayoría de los problemas, generalmente termino agregando un (: uso [protocolos]) a la mayoría de las declaraciones de ns y todo "simplemente funciona". Lo único que todavía me resulta desagradable es el hecho de que declares una clase (por ejemplo, un deftype) a la que quieras hacer referencia antes de declararla (por ejemplo, como una sugerencia de tipo en una definición de protocolo). – mikera
Gracias por la actualización, feliz de escuchar eso! Creo que insinuar funciones de protocolo/interfaz con los nombres de las clases reales de implementación puede no ser una muy buena idea, (en realidad tenía la impresión de que los métodos de protocolo no se podían insinuar en absoluto, pero los métodos de interfaz pueden y el argumento es el mismo): sugerencia con el nombre de la interfaz en su lugar. Si se trata de una clase creada con 'deftype', todos sus métodos serán' Object'/interface/protocol methods de todos modos. La única vez que usaría sugerencias para apuntar a las clases es cuando eso es necesario para la interoperabilidad. –