Во-первых, команда open
предназначена только для управления пространством имен. Т.е. он управляет набором видимых имен. Он не имеет эффекта (как это часто предполагается), когда обнаруживает и делает модуль доступным. (Как правило, вам следует избегать чрезмерного использования open
. В этом нет необходимости; вы всегда можете использовать полный синтаксис Module.name
.)
В командной строке ocaml
берется любое количество скомпилированных модулей ocaml, за которым следует один файл ocaml (.ml).
Таким образом, вы можете сделать то, что вы хотите, скомпилировав файл template.ml перед началом:
$ ocamlc -c template.ml
$ ocaml template.cmo test.ml
Вот полностью проработанный пример с минимальным содержанием файлов:
$ cat template.ml
let f x = x + 5
$ cat test.ml
let main () = Printf.printf "%d\n" (Template.f 14)
let () = main ()
$ ocamlc -c template.ml
$ ocaml template.cmo test.ml
19
Для чего стоит думать об OCaml как о скомпилированном языке, а не как языке сценариев. Поэтому я обычно собираю все файлы и запускаю их. Используя те же файлы, что и выше, это выглядит следующим образом:
$ ocamlc -o test template.ml test.ml
$ ./test
19
Я использую команду ocaml
только тогда, когда хочу взаимодействовать с интерпретатором (который люди из OCaml традиционно называли «верхним уровнем») .
$ ocaml
OCaml version 4.10.0
# let f x = x + 5;;
val f : int -> int = <fun>
# f 14;;
- : int = 19
#