Domanda

Sto scrivendo un interprete per una lingua sperimentale.Tre dei principali costrutti del linguaggio sono definizioni, affermazioni ed espressioni.Le definizioni possono contenere istruzioni ed espressioni, le istruzioni possono contenere definizioni ed espressioni e un tipo di espressione può contenere istruzioni.Rappresento tutti questi utilizzando i tipi di unione in modo da poter utilizzare facilmente la corrispondenza dei modelli su di essi.Idealmente, vorrei inserire il codice per questi in file diversi, ma OMake lamenta problemi di dipendenza circolare.Per quanto ne so, non sono consentite definizioni di tipo circolare tra moduli.

L'unico modo che conosco per risolvere questo problema è definire tutti e tre i tipi contemporaneamente:

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

Sembra che ciò richieda che tutto il codice per i tipi sia nello stesso file.C'è un modo per aggirare questo?Come gestisci le definizioni circolari nel tuo codice?

È stato utile?

Soluzione

Le definizioni ricorsive devono apparire nello stesso file.Se desideri separare definizioni, istruzioni ed espressioni in moduli separati, puoi farlo utilizzando moduli ricorsivi, ma dovranno comunque apparire nello stesso file.Le dipendenze tra file DAG sono uno dei fastidi di OCaml.

Altri suggerimenti

Questo è facilmente risolvibile parametrizzando i tuoi tipi sui tipi a cui si riferiscono:

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

Questa tecnica è chiamata "sciogliere il nodo ricorsivo" (in riferimento al nodo gordiano) ed è stata descritta in un OCaml Journal articolo.

Saluti, Jon Harrop.

Un'altra soluzione spesso utilizzata è quella di astrarre i tipi nelle interfacce.Poiché i tipi sono astratti nelle interfacce, queste interfacce non sono dipendenti in modo ricorsivo.Nelle implementazioni è possibile specificare i tipi e poiché le implementazioni dipendono solo dalle interfacce, non sono nemmeno ricorsive.

L'unico problema è che, con questa soluzione, non è più possibile eseguire il pattern-matching su questi tipi al di fuori della loro implementazione.

Personalmente, ma probabilmente è una questione di gusti, mi piace avere tutti i tipi del mio programma definiti in un unico modulo (penso che aiuti nella leggibilità del programma).Quindi questa restrizione di OCaml non è davvero un problema per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top