在OCaml中获取脚本名称?

时间:2011-09-30 02:47:03

标签: module ocaml filenames

OCaml是否有办法获取当前文件/模块/脚本名称?类似的东西:

  • C / C ++的argv[0]
  • Python的sys.argv[0]
  • Perl / Ruby的$0
  • Erlang的?FILE
  • C#的ProgramName.Environment.CommandLine
  • 因素scriptname/script
  • Go os.Args[0]
  • Haskell的System/getProgName
  • Java的System.getProperty("sun.java.command").split(" ")[0]
  • Node.js的__filename
  • etc.

4 个答案:

答案 0 :(得分:11)

我对OCaml一无所知,但一些谷歌搜索出现了

Sys.argv.(0)

请参阅http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#toc12

答案 1 :(得分:3)

我认为你在OCaml中编写脚本。然后Sys.argv。(0)是获取脚本名称的最简单方法。 Sys模块还提供了Sys.executable_name,但其语义略有不同:

let _ = prerr_endline Sys.executable_name; Array.iter prerr_endline Sys.argv ;;

如果我运行以上行,将该行放在test.ml中,通过ocaml test.ml hello world,我有:

/usr/local/bin/ocaml         - executable_name
test.ml                      - argv.(0)
hello                        - argv.(1)
world                        - argv.(2)

所以OCaml toplevel为你做了一些反对argv的事情。

通常,在OCaml中获取当前模块名称并不容易,原因如下:

  • ML模块非常灵活,可以别名,包含在其他模块中,并应用于模块仿函数。
  • OCaml未将模块名称嵌入其目标文件中。

一种可能的解决方法是自己为模块名称添加变量,例如:

让ml_source_name =“foobar.ml”

这个定义可能会被某些预处理自动插入。但是,我不确定CamlP4是否可以拥有当前处理源文件的文件名。

如果你的主要目的是简单的脚本,那么当然这种预处理过于复杂,我担心。

答案 2 :(得分:1)

let _ =
    let program = Sys.argv.(0) in
        print_endline ("Program: " ^ program)

并发布到RosettaCode

答案 3 :(得分:0)

在OCaml> = 4.02.0中,您还可以使用__FILE__获取当前文件的文件名,该文件名与Node的__filename类似,但与Sys.argv.(0)不同。