Основная функция в OCaml


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

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

main ()

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

Printf.printf "Hello, world - %d %sn" (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 находит основной код с несколькими исходными кодами?

2 5

2 ответа:

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

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

Нет, основная функция не нужна в OCaml, и она разбирает код от начала до конца.

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