Основная функция в 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 ответа:
OCaml смутно напоминает язык сценариев в том, что любые выражения верхнего уровня вычисляются при запуске программы. Обычно есть функция с именем
main
, которая вызывает основную работу вашей программы. Но в этом нет никакой необходимости.Выражения вычисляются в том порядке, в котором файлы OCaml появились, когда они были связаны в исполняемый файл. Очень часто это означает, что вызов
main
является последним, что происходит при запуске программы. Другие файлы часто появляются перед тем, который содержитmain
, и любой код верхнего уровня этих файлов будет выполнен первым.