Как скомпилировать и протестировать функции в ocaml? - PullRequest
0 голосов
/ 01 июля 2019

Для моего летнего курса программирования мне нужно скомпилировать и протестировать несколько функций из файла ocaml (файл .ml), который дал нам наш учитель. Я никогда раньше не программировал в ocaml, но я скачал его на свой ubuntu vm, и я не могу понять, как его скомпилировать и протестировать функции из терминала.

Мне также любопытно, нужно ли мне добавлять операторы print в код для их проверки, поскольку ocaml не требует основных методов. Если да, то как мне напечатать возвращаемое значение функции?

Спасибо за вашу помощь, я прошу прощения, если это вопрос новичка.

1 Ответ

3 голосов
/ 02 июля 2019
  1. Убедитесь, что вы правильно установили 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
    
  2. Теперь мы готовы скомпилировать нашу первую программу.В 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, чтобы запустить построенную цель, как только она будет готова.Любой аргумент после -- передается вашей программе в качестве аргументов командной строки.

  3. А как насчет более крупных программ или программ с зависимостями?Хорошей новостью является то, что вы можете поместить свой код в несколько файлов в одну и ту же папку , и 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
    

1 ) Способ установки пакета зависит от системы.Например, если вы используете apt для установки OCaml, вы можете сделать sudo apt install libfileutils-ocaml-dev.Если вы используете опам (рекомендуемый способ), то это просто opam install fileutils.В любом случае установка пакета выходит за рамки этого вопроса, я предполагаю, что в вашем курсе вы будете использовать некоторые предварительно установленные пакеты.Мы используем fileutils здесь просто в качестве примера, который вы можете легко адаптировать к вашим собственным целям.

...