OCaml是否有办法获取当前文件/模块/脚本名称?类似的东西:
argv[0]
sys.argv[0]
$0
?FILE
ProgramName.Environment.CommandLine
scriptname/script
os.Args[0]
System/getProgName
System.getProperty("sun.java.command").split(" ")[0]
__filename
答案 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_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)
不同。