5

如何在 OCaml 中模拟这个 Python 习语?

if __name__=="__main__":
   main()

有关其他编程语言的示例,请参阅RosettaCode

4

2 回答 2

6

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 习语并不完全一样,后者不依赖于具有特定名称的顶级脚本。

于 2011-09-29T23:30:07.610 回答
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

脚本main.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 -> ()

测试.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上。

于 2011-09-30T18:42:51.763 回答