2008-08-30 5 views
11

Я пишу переводчика для экспериментального языка. Три основные конструкции языка - это определения, утверждения и выражения. Определения могут содержать утверждения и выражения, операторы могут содержать определения и выражения, а один вид выражения может содержать утверждения. Я представляю все эти типы соединений, поэтому я могу легко использовать сопоставление шаблонов. В идеале, я хотел бы поместить код для них в разные файлы, но OMake жалуется на проблемы с круговой зависимостью. Насколько я знаю, описания круговых типов в разных модулях не допускаются.Работа с круговыми зависимостями в OCaml

Единственный способ, которым я знаю, чтобы решить эту проблему, чтобы определить все три типа сразу:

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

Похоже, это требует всего кода для типов, чтобы быть в том же файле. Есть ли способ обойти это? Как вы имеете дело с круговыми определениями в вашем коде?

ответ

15

Рекурсивные определения должны отображаться в одном файле. Если вы хотите разделить определения, инструкции и выражения на отдельные модули, вы можете сделать это с помощью recursive modules, но они все равно должны появиться в том же файле. DAG-форматирование зависимостей между файлами является одним из раздражителей OCaml.

12

Это легко решаются с помощью параметрирования ваших типов по сортам они относятся:

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

Эта техника называется «развязывает рекурсивный узел» (со ссылкой на узел гордиев), и был описана в OCaml Journal статье ,

Cheers, Jon Harrop.

3

Другим решением, часто используемым, является абстрагирование типов в интерфейсах. Поскольку типы являются абстрактными в интерфейсах, эти интерфейсы не зависят от рекурсивно. В реализациях вы можете указать типы, и поскольку реализации зависят только от интерфейсов, они также не являются рекурсивными.

Проблема только в том, что с этим решением вы больше не сможете сопоставлять шаблоны с этими типами вне их реализации.

Лично, но это, вероятно, вопрос вкуса, мне нравится иметь все типы моей программы, определенные в одном модуле (я думаю, что это помогает в удобочитаемости программы). Таким образом, это ограничение OCaml для меня не является проблемой.

 Смежные вопросы

  • Нет связанных вопросов^_^