Pregunta

Estoy escribiendo un intérprete para un lenguaje experimental.Tres de las principales construcciones del lenguaje son las definiciones, los enunciados y las 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 todos estos usando tipos de unión para poder usar fácilmente la coincidencia de patrones en ellos.Idealmente, me gustaría poner el código para estos en archivos diferentes, pero OMake se queja de problemas de dependencia circular.Hasta donde yo sé, no se permiten definiciones de tipo circular entre módulos.

La única forma que conozco de resolver esto es definir los tres tipos a la vez:

type defn = ...
and stmt = ...
and expr = ...

Parece que esto requiere que todo el código de los tipos esté en el mismo archivo.¿Hay alguna manera de evitar esto?¿Cómo maneja las definiciones circulares en su código?

¿Fue útil?

Solución

Las definiciones recursivas deben aparecer en el mismo archivo.Si desea separar definiciones, declaraciones y expresiones en módulos separados, puede hacerlo usando módulos recursivos, pero aún así tendrán que aparecer en el mismo archivo.Las dependencias entre archivos que generan DAG son una de las molestias de OCaml.

Otros consejos

Esto se resuelve fácilmente parametrizando sus tipos sobre los tipos a los que se refieren:

type ('stmt, 'expr) defn = ...
type ('defn, 'expr) stmt = ...
type ('defn, 'stmt) expr = ...

Esta técnica se llama "desatar el nudo recursivo" (en referencia al nudo gordiano) y fue descrita en un Diario OCaml artículo.

Saludos, Jon Harrop.

Otra solución que se utiliza frecuentemente es abstraer los tipos en las interfaces.Dado que los tipos son abstractos en las interfaces, estas interfaces no dependen recursivamente.En las implementaciones puedes especificar los tipos, y como las implementaciones dependen solo de las interfaces, tampoco son recursivas.

El único problema es que, con esta solución, ya no se pueden hacer coincidencias de patrones en estos tipos fuera de su implementación.

Personalmente, pero probablemente sea una cuestión de gustos, me gusta tener todos los tipos de mi programa definidos en un módulo (creo que ayuda a la legibilidad del programa).Entonces, esta restricción de OCaml no es realmente un problema para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top