Убедитесь, что вы правильно установили OCaml, запустив интерактивный уровень OCaml (не вводите $
, это приглашение от вашей оболочки):
$ ocaml
Он должен отображать что-то вроде этого:
OCaml version 4.07.0
#
Символ #
является приглашением, вы можете ввести там определения OCaml и отправить их интерпретатору, используя завершающую последовательность ;;
(опять же, не вводите#
это также символ приглашения), например,
# print_endline "Hello, world";;
Hello, world
- : unit = ()
#
Подсказка: для включения истории установите rlwrap
с sudo apt install rlwrap
и запустите ocaml
toplevel как
$ rlwrap ocaml
Теперь мы готовы скомпилировать нашу первую программу.В OCaml, как и в Python, все определения верхнего уровня в вашей программе оцениваются в порядке их появления, поэтому вам не нужно иметь специальную функцию main
.Несмотря на этот факт, я обычно определяю один, используя следующую идиому
let main () =
print_endline "Hello, world"
(* the entry point - just call the main function *)
let () = main ()
Теперь создайте новую папку (убедитесь, что она пуста)
$ mkdir my-first-ocaml-program
$ cd my-first-ocaml-program
и поместите OCamlкод выше в файл с именем test.ml
(имя файла не имеет никакого особого значения для цепочки инструментов компилятора, но я буду ссылаться на это имя в командах оболочки ниже).
давайте проверим, что все правильно,распечатав содержимое файла test.ml
$ cat test.ml
и результат должен быть
let main () =
print_endline "Hello, world"
(* the entry point - just call the main function *)
let () = main ()
Теперь давайте скомпилируем и запустим одновременно,
$ ocamlbuild test.native --
И мы должны увидеть "Hello, world"
,
Finished, 4 targets (4 cached) in 00:00:00.
Hello, world
Первая строка - это вывод компилятора (игнорируйте его, если он не отличается).Начиная со второй строки это наш вывод.Вот некоторые пояснения по сборке однострочника ocamlbuild test.native
.Он использует ocamlbuild
, простой в использовании, но мощный инструмент сборки OCaml.test.native
сообщает ocamlbuild
, что вы хотите создать собственный двоичный (машинный код) двоичный файл и что test.ml
является основным исходным файлом.Вы также можете попросить создать двоичный файл байт-кода, например, test.byte
.Это называется target на языке ocamlbuild.--
является необязательным, и он сообщает ocamlbuild, чтобы запустить построенную цель, как только она будет готова.Любой аргумент после --
передается вашей программе в качестве аргументов командной строки.
А как насчет более крупных программ или программ с зависимостями?Хорошей новостью является то, что вы можете поместить свой код в несколько файлов в одну и ту же папку , и ocamlbuild будет достаточно умен, чтобы построить их в правильном порядке (он будет выполнять анализ зависимостей, компилировать и связывать дляу вас - все без проблем).Если вам нужно использовать какой-то внешний пакет, вы можете указать его с помощью опции -pkg
.Например, предположим, что мы используем пакет fileutils
для реализации нашей версии программы ls
1 .Давайте обновим наш test.ml
, чтобы он теперь имел следующее содержимое:
$ cat test.ml
let main () =
FileUtil.ls "." |> List.iter print_endline
(* the entry point - just call the main function *)
let () = main ()
и, как обычно, собрал и напечатал в одном
$ ocamlbuild -pkg fileutils test.native --
Finished, 4 targets (4 cached) in 00:00:00.
./test.native
./_build
./test.ml