Сценарий основной в OCaml?
Как я могу эмулировать эту идиому Python в OCaml?
if __name__=="__main__":
main()
Смотрите RosettaCode для примеров на других языках программирования.
2 ответа
$ 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.
В 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, которая не зависит от сценария верхнего уровня, имеющего определенное имя.