Frage

Ich schreibe einen Dolmetscher für eine experimentelle Sprache.Drei der Hauptkonstrukte der Sprache sind Definitionen, Aussagen und Ausdrücke.Definitionen können Anweisungen und Ausdrücke enthalten, Anweisungen können Definitionen und Ausdrücke enthalten und eine Art von Ausdruck kann Anweisungen enthalten.Ich stelle all dies mithilfe von Union-Typen dar, sodass ich den Mustervergleich problemlos darauf anwenden kann.Idealerweise würde ich den Code dafür gerne in verschiedenen Dateien ablegen, aber OMake beschwert sich über Probleme mit zirkulären Abhängigkeiten.Soweit ich weiß, sind zirkuläre Typdefinitionen über Module hinweg nicht zulässig.

Die einzige mir bekannte Möglichkeit, dieses Problem zu lösen, besteht darin, alle drei Typen gleichzeitig zu definieren:

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

Es scheint, dass hierfür der gesamte Code für Typen in derselben Datei erforderlich ist.Gibt es eine Möglichkeit, dies zu umgehen?Wie gehen Sie mit zirkulären Definitionen in Ihrem Code um?

War es hilfreich?

Lösung

Rekursive Definitionen müssen in derselben Datei erscheinen.Wenn Sie Definitionen, Anweisungen und Ausdrücke in separate Module aufteilen möchten, können Sie dies mit tun rekursive Module, sie müssen jedoch weiterhin in derselben Datei angezeigt werden.Eines der Ärgernisse von OCaml ist die DAG-Verifizierung von Abhängigkeiten zwischen Dateien.

Andere Tipps

Dies lässt sich leicht lösen, indem Sie Ihre Typen über die Typen parametrisieren, auf die sie verweisen:

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

Diese Technik wird „Lösen des rekursiven Knotens“ (in Anlehnung an Gordians Knoten) genannt und wurde in einem OCaml-Journal Artikel.

Prost, Jon Harrop.

Eine andere häufig verwendete Lösung besteht darin, die Typen in den Schnittstellen zu abstrahieren.Da die Typen in den Schnittstellen abstrakt sind, sind diese Schnittstellen nicht rekursiv abhängig.In den Implementierungen können Sie die Typen angeben, und da die Implementierungen nur von den Schnittstellen abhängen, sind sie auch nicht rekursiv.

Das einzige Problem besteht darin, dass Sie mit dieser Lösung keinen Mustervergleich mehr für diese Typen außerhalb ihrer Implementierung durchführen können.

Persönlich, aber es ist wahrscheinlich eine Frage des Geschmacks, mag ich es, wenn alle Arten meines Programms in einem Modul definiert sind (ich denke, das trägt zur Lesbarkeit des Programms bei).Daher ist diese Einschränkung von OCaml für mich kein wirkliches Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top