У меня есть небольшой язык, который в основном является расширением OCaml (на самом деле это расширение подмножества OCaml, но это не имеет значения). Для упрощения у меня есть одно «escape-выражение», которое переносит литералы OCaml на мой язык (следовательно, вы можете встраивать произвольный код OCaml в этот язык). Скомпилировать такое выражение в OCaml означало бы просто развернуть строку, но как ее оценить?
Конечно, я понимаю, что OCaml - это язык со статической типизацией, и как эта система типов работает в целом. Следовательно, мне также нужно иметь возможность предоставить среду и проверить предполагаемый тип выражения (или, по крайней мере, справиться с ошибками типа). Я также осознаю необходимость управления состоянием интерпретатора и т. Д. Давайте предположим, что встроенные выражения не имеют побочных эффектов.
Очевидно, это возможно, поскольку и utop, и верхний уровень реализованы в OCaml сами. Итак, моей первой идеей было просто выбрать одну из них и адаптировать под свои нужды. Теперь о моих проблемах:
toplevel, очевидно, является частью основного дистрибутива. Хотя существует toplevel.mli с необходимыми функциями и даже .mllib, я не могу найти toplevel как упакованную библиотеку - есть ли дополнительные настройки конфигурации, необходимые для получения "интерпретатора как библиотеки" упаковка?
utop, кажется, делает еще более странные вещи. Насколько я могу судить по источникам, он копирует некоторые библиотеки компиляторов в свой исходный каталог во время сборки. Это кажется довольно странным: если он знает во время сборки, как найти эти библиотеки компилятора, почему бы просто не связать?
Итак, есть ли какой-нибудь разумно установленный способ встраивать интерпретатор OCaml в программу OCaml?