Я хотел бы написать модуль OCaml, имеющий функцию compile
, которая будет принимать строку, содержащую программу OCaml, и выводить результат компиляции как Correct или Error, а в случае Error - информацию о строке и символе. первой ошибки. Меня не волнует, в чем была ошибка (по крайней мере, на данный момент).
Основной тип модуля для этого:
module type Compile =
sig
type result = Correct | Error of (int*int)
val compile : string -> result
end
Существует как минимум два принципиально разных способа его реализации:
- быстрый способ взлома - записать строку с программой в файл, использовать процессы Unix для вызова
ocamlc
в командной строке и проанализировать stderr;
- правильный путь - используйте инструменты OCaml для анализа кода.
Что касается (1), у меня возникают проблемы с получением содержимого stderr. Я начал с использования
Unix.open_process_in
, который перенаправляет стандартный вывод в in_channel, который я затем могу прочитать.
Так как ошибки компиляции, выводимые ocamlc
, идут в stderr (а не в stdout), я попытался использовать
let ic = Unix.open_process_in "ocamlc test.ml 2>&1"
, чтобы содержимое stderr было перенаправлено в командной строке на stdout. Таким образом, я ожидаю, ic
будет содержать ошибки компиляции. К сожалению, это был не тот случай, и ic
содержал только End_of_file
.
Затем я перешел к команде Unix.create_process
, так как она позволяет мне выбирать новые каналы для out, in, err. Но у меня проблемы с выбором этих каналов. Каким должен быть выходной канал, чтобы я мог прочитать его в своей программе?
Что касается (2), что, по вашему мнению, является (разумно) простым путем?
Большое спасибо за любую помощь!