Сценарий основной в OCaml? - PullRequest
       29

Сценарий основной в OCaml?

4 голосов
/ 30 сентября 2011

Как мне эмулировать эту идиому Python в OCaml?

if __name__=="__main__":
   main()

См. RosettaCode для примеров на других языках программирования.

Ответы [ 2 ]

5 голосов
/ 30 сентября 2011

В Ocaml нет понятия основного модуля. Все модули в программе равны. Таким образом, вы не можете напрямую перевести эту идиому Python.

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

Существует способ узнать имя модуля, но он довольно хакерский, поскольку предназначен только для отладки. Это нарушает обычное предположение, что вы можете переименовать модуль без изменения его поведения. Если вы полагаетесь на это, другие программисты, читающие ваш код, будут вас проклинать. Этот метод предназначен только для развлекательных целей и не должен использоваться в реальной жизни.

let name_of_this_compilation_unit = 
  try assert false with Assert_failure (filename, _, _) -> filename

Вы можете сравнить название модуля компиляции с Sys.executable_name или Sys.argv.(0). Обратите внимание, что на самом деле это не то же самое, что идиома Python, которая не использует скрипт верхнего уровня с конкретным именем.

1 голос
/ 30 сентября 2011
$ ocamlc -o scriptedmain -linkall str.cma scriptedmain.ml
$ ./scriptedmain
Main: The meaning of life is 42
$ ocamlc -o test -linkall str.cma scriptedmain.ml test.ml
$ ./test
Test: The meaning of life is 42

scriptedmain.ml:

let meaning_of_life : int = 42

let main () = print_endline ("Main: The meaning of life is " ^ string_of_int meaning_of_life)

let _ =
    let program = Sys.argv.(0)
    and re = Str.regexp "scriptedmain" in
        try let _ = Str.search_forward re program 0 in
            main ()
        with Not_found -> ()

test.ml:

let main () = print_endline ("Test: The meaning of life is " ^ string_of_int Scriptedmain.meaning_of_life)

let _ =
    let program = Sys.argv.(0)
    and re = Str.regexp "test" in
        try let _ = Str.search_forward re program 0 in
            main ()
        with Not_found -> ()

Опубликовано RosettaCode .

...