编译后的PolyML程序如何获取运行时命令行参数?
解决PolyML编译程序获取运行时命令行参数的问题
你的判断完全正确:PolyML中顶级的val绑定会在编译阶段求值,所以val args = CommandLine.arguments()捕获的是编译polyc命令自身的参数,而非程序运行时传入的参数。
解决方案
把获取命令行参数的逻辑移到main函数内部,确保代码在程序运行时执行,才能拿到正确的运行时参数。
修改后的代码示例:
fun main () = let val args = CommandLine.arguments() in app (fn s => (print s ; print "\n\n")) args end val _ = main ()
编译与运行
使用原有命令编译:
polyc print_args.ml -o print_args
执行程序时传入参数:
./print_args foo bar
此时会输出预期的:
foo bar
另一种方式:使用PolyML.export指定入口
也可以通过PolyML.export明确指定程序入口函数,这种方式更符合编译型程序的规范:
fun main () = let val args = CommandLine.arguments() in app (fn s => (print s ; print "\n\n")) args end val _ = PolyML.export("print_args", main)
编译时直接运行:
polyc print_args.ml
生成的print_args可执行文件运行时同样能正确获取命令行参数。
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

