Escribo un intérprete para un lenguaje experimental. Tres de los constructos principales del lenguaje son definiciones, enunciados y expresiones. Las definiciones pueden contener declaraciones y expresiones, las declaraciones pueden contener definiciones y expresiones, y un tipo de expresión puede contener declaraciones. Represento a todos estos utilizando tipos de unión para que pueda usar fácilmente la coincidencia de patrones en ellos. Idealmente, me gustaría poner el código para estos en diferentes archivos, pero OMake se queja de problemas de dependencia circular. Hasta donde yo sé, no se permiten las definiciones de tipo circulares en los módulos.Tratamiento de dependencias circulares en OCaml
La única forma que conozco para resolver esto es definir los tres tipos a la vez:
type defn = ...
and stmt = ...
and expr = ...
Parece que esto requiere todo el código para este tipo estén en el mismo archivo. ¿Hay alguna forma de evitar esto? ¿Cómo manejas las definiciones circulares en tu código?