Это мой основной метод для OCaml от программиста, обученного в мире C.

let main () = 
    Printf.printf "Hello, world - %d %s\n" (Array.length Sys.argv)  Sys.argv.(0)
    ;;

main ()

Однако этот код отлично работает с ocaml / ocamlc / ocmalopt.

Printf.printf "Hello, world - %d %s\n" (Array.length Sys.argv)  Sys.argv.(0)
;;

Какая за этим логика? Является ли OCaml чем-то вроде языка сценариев (даже если он компилируется в двоичный файл с помощью ocamlc или ocamlopt) в том смысле, что ему не нужна основная функция?

По сравнению со Scala, мы можем расширять приложение, чтобы не определять основной метод.

object Hello extends App {
    class A

    println(new A() getClass())
    print("Hello, world")
}

Даже в этом случае нам нужно иметь Hello.main(args) при выполнении в режиме интерпретатора: то есть scala hello.scala. OCaml, похоже, не нуждается в каких-либо изменениях в ocaml (интерпретируемый), ocamlc и ocamlopt (скомпилированный).

Итак, нужна ли нам основная функция в OCaml? Если да, то генерирует ли OCaml код от начала до конца? Если да, то как OCaml находит основной код с несколькими исходными кодами?

7
prosseek 25 Фев 2015 в 08:07

2 ответа

Лучший ответ

OCaml в некоторой степени похож на язык сценариев в том смысле, что любые выражения верхнего уровня оцениваются при запуске программы. Принято иметь функцию с именем main, которая вызывает основную работу вашей программы. Но это совсем не обязательно.

Выражения оцениваются в том порядке, в котором файлы OCaml появлялись, когда они были связаны с исполняемым файлом. Очень часто это означает, что вызов main - последнее, что происходит при запуске программы. Другие файлы часто появляются перед файлом, содержащим main, и любой код верхнего уровня этих файлов будет выполнен первым.

9
Jeffrey Scofield 25 Фев 2015 в 05:23

Нет, функция main в OCaml не нужна, и она выполняет синтаксический анализ кода от начала до конца.

Когда у вас есть несколько файлов, вам нужно будет скомпилировать их по порядку (или с помощью прямых ссылок)

3
Secret 25 Фев 2015 в 05:18