Как загрузить несколько файлов OCaml на верхний уровень? - PullRequest
0 голосов
/ 22 апреля 2020

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

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.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Если вы хотите выполнить свой код таким образом, вы ограничены тем, что команда 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
0 голосов
/ 24 апреля 2020

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

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

...