Встраивание предметно-ориентированного языка в OCaml верхнего уровня - в Camlp4 или нет?

У меня есть код, который включает в себя menhirсинтаксический анализатор для предметно- ориентированного языка (логика). Ради здравого смысла во время отладки, было бы здорово иметь возможность печатать экземпляры этого языка (формулы) непосредственно на верхнем уровне следующим образом:

# f = << P(x,y) & x!=y >>

Является campl4/5 мой единственный вариант? Если да, я нахожу документацию довольно пугающей. Есть ли пример / учебник, который достаточно близок к моему сценарию использования и который я мог бы адаптировать? (Например, синтаксические расширения, которые вводят новые ключевые слова, не кажутся актуальными). Спасибо!

2 ответа

Решение

Если вы хотите вызвать функцию для анализа, вы можете использовать ocamlmktop включить ваш парсер в верхний уровень. Затем вы можете установить принтеры для ваших типов, используя #install_printer, Сессии могут выглядеть так:

# let x = parse ()
<< type your expression here >>
# x : type = <<formatted version>>

Я использовал специальные принтеры, и они определенно очень помогают со сложными типами. Я никогда не удосужился использовать ocamlmktop, Я всегда просто загружаю свой код с #load а также #use,

Это намного проще, чем освоение camlp4/5 (ИМХО). Но, возможно, это слишком грубо.

Да, вы можете использовать camlp4, и он будет работать достаточно хорошо (в том числе на верхнем уровне), но нет, он не очень хорошо документирован, и вам придется с этим справляться.

Пример, близкий к вашему сценарию использования, приведен в примере цитаты лямбда-исчисления вики Camlp4.

Для верхнего уровня это будет работать легко. Вы можете динамически загрузить "camlp4o.cmo", а затем ваше синтаксическое расширение на верхний уровень, или использовать findlib, который обрабатывает это: с верхнего уровня, #use "topfind";;, затем #camlp4o;;, затем #require "myfoo.syntax";; где myfoo.syntax это имя пакета findlib, который вы создали для развертывания вашего расширения.

Другие вопросы по тегам