答案 0 :(得分:5)
Ocaml中没有主模块的概念。程序中的所有模块都是相同的。所以你不能直接翻译这个Python习语。
Ocaml中的常用方法是拥有一个单独的文件,其中包含对main
的调用,以及其他类似命令行解析的内容,这些内容仅在独立的可执行文件中有意义。将代码链接为库时,请勿包含该源文件。
有一种方法可以获取模块的名称,但它相当hackish,因为它仅用于调试。它违反了通常的假设,即您可以在不更改其行为的情况下重命名模块。如果你依赖它,那么阅读你代码的其他程序员会诅咒你。此方法仅用于娱乐目的,不应在现实生活中使用。
let name_of_this_compilation_unit =
try assert false with Assert_failure (filename, _, _) -> filename
您可以将编译单元的名称与Sys.executable_name
或Sys.argv.(0)
进行比较。请注意,这与Python习惯用法并不完全相同,后者不依赖于具有特定名称的顶级脚本。
答案 1 :(得分:1)
$ 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。