OCaml中的脚本主要?

mca*_*dre 4 ocaml scriptedmain

如何在OCaml中模拟这个Python习惯用法?

if __name__=="__main__":
   main()
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 5

Ocaml中没有主模块的概念.程序中的所有模块都是相同的.所以你不能直接翻译这个Python成语.

Ocaml中的常用方法是使用一个单独的文件来包含对其的调用main,以及命令行解析等其他内容,这些内容仅在独立的可执行文件中有意义.将代码链接为库时,请勿包含该源文件.

有一种方法可以获得模块的名称,但它相当hackish,因为它仅用于调试.它违反了通常的假设,即您可以在不改变其行为的情况下重命名模块.如果你依赖它,那么阅读你代码的其他程序员会诅咒你.此方法仅用于娱乐目的,不应在现实生活中使用.

let name_of_this_compilation_unit = 
  try assert false with Assert_failure (filename, _, _) -> filename
Run Code Online (Sandbox Code Playgroud)

您可以将编译单元的名称与Sys.executable_name或进行比较Sys.argv.(0).请注意,这与Python习惯用法并不完全相同,后者不依赖于具有特定名称的顶级脚本.

  • 这些是不同的问题.我认为使用某些camlp4语法扩展时文件名是可用的.模块名称也可以,尽管"模块名称"的定义可能会因仿函数,本地模块和一流模块而变得棘手.命令行参数可通过Sys.argv获得.您还可以检查是否在具有值Sys.interactive的交互式环境中运行. (2认同)

mca*_*dre 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
Run Code Online (Sandbox Code Playgroud)

脚本化的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 -> ()
Run Code Online (Sandbox Code Playgroud)

测试.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 -> ()
Run Code Online (Sandbox Code Playgroud)

发布在RosettaCode上。