Как загрузить несколько файлов OCaml на верхний уровень?

Я пытаюсь отладить программу, которую я сделал. Вот как выглядит моя структура каталогов:

src
 |- module1.ml
 |- section1
     |- module2.ml
     |- module3.ml

На module1.ml ссылаются как module2.ml, так и module3.ml. Module2.ml ссылается на module3.ml.

Я попытался загрузить файлы на верхний уровень с помощью команды

ocaml -I section1 module1.ml section1/module2.ml section1/module3.ml

но это не работает. Он даже не поднимает верхний уровень и не печатает ошибку. Он абсолютно ничего не делает, и я вернулся к тому, с чего начал с командной строки Bash.


person InfiniteDonuts    schedule 22.04.2020    source источник


Ответы (2)


Если вы хотите запускать свой код таким образом, вы ограничены тем фактом, что команда ocaml ожидает любое количество предварительно скомпилированных файлов OCaml (файлов байт-кода) и один файл .ml. Если вы указываете несколько файлов .ml, он игнорирует все, кроме первого.

Причина наблюдаемого вами поведения заключается в том, что ваша командная строка запрашивает ocaml запуск файла как программы. Другими словами, он выполнит весь код верхнего уровня в первом файле .ml (игнорируя остальные), а затем завершит работу. Я предполагаю, что у вас нет кода верхнего уровня, который дает видимый результат в вашем файле module1.ml.

Вы можете заставить это работать (или, по крайней мере, улучшить ситуацию), скомпилировав все файлы, кроме одного, используя ocamlc:

$ ocamlc -c section1/module2.ml
$ ocamlc -c section2/module3.ml
$ ocaml section1/module2.cmo section1/module3.cmo module1.ml

Вы также можете загружать файлы на верхний уровень после его запуска:

$ ocaml
        OCaml version 4.10.0

# #use "section1/module2.ml";;
# #use "section1/module3.ml";;
# #use "module1.ml";;
# 

Это то, что я обычно делаю, чтобы интерактивно экспериментировать со своим кодом.

С другой стороны, если я просто хочу запустить код, я компилирую все файлы, а затем просто запускаю результат:

$ ocamlc -o myprogram section1/module2.ml section1/module3.ml module1.ml
$ ./myprogram
person Jeffrey Scofield    schedule 22.04.2020

В дополнение к данному вам ответу, если вы хотите загружать модули с верхнего уровня без компиляции модулей, вы можете использовать директиву #mod_use, добавленную, я верю, в ocaml-4.01. Она ведет себя так же, как директива #use, за исключением того, что ваш код выглядит так, как если бы он был скомпилированным модулем (поэтому имя файла становится начальным именем модуля).

См. http://caml.inria.fr/pub/docs/manual-ocaml/toplevel.html#s%3Atoplevel-directives

person Chris Vine    schedule 24.04.2020