我开始学习标准ML,并尝试使用New Jersey标准ML编译器。
现在我可以使用交互式环境,但是如何将源文件编译为独立的可执行文件呢?
例如在C中,我们可以这样写:
$ gcc hello_world.c -o helloworld
然后运行helloworld二进制文件。
我查阅了SML NJ Compilation Manager文档,但它没有任何清晰的示例。
此外,是否有其他标准ML编译器(可以创建独立的二进制文件)可用?
无论是MosML还是MLton都可以创建独立的二进制文件。MosML通过mosmlc命令,而MLton通过mlton命令。
请注意,MLton没有交互式循环,但它是一个整体程序优化编译器。这基本上意味着编译需要相当长的时间,但反过来会生成极快的SML程序。
对于SML/NJ,您可以使用CM.mk_standalone
函数,但在CM用户手册第45页中不建议使用此方法。相反,他们建议您使用ml-build命令。这将生成一个SML/NJ堆映像。必须使用@SMLload参数运行堆映像,或者您可以使用heap2exec程序(前提是您有受支持的系统)。如果没有,则建议使用MLton。
以下内容可用于生成有效的SML/NJ堆映像:
test.cm:
Group is
test.sml
$/basis.cm
test.sml:
structure Test =
struct
fun main (prog_name, args) =
let
val _ = print ("Program name: " ^ prog_name ^ "\n")
val _ = print "Arguments:\n"
val _ = map (fn s => print ("\t" ^ s ^ "\n")) args
in
1
end
end
要生成堆图像,您可以使用:ml-build test.cm Test.main test-image
,然后通过 sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument"
运行它,其中 XXXXX 是您的架构。
如果您决定在某个时候使用 MLton,则不需要具有任何主函数。它在顶层评估所有内容,因此您可以创建一个 main 函数,并通过类似以下方式调用它:
fun main () = print "this is the main function\n"
val foo = 4
val _ = print ((Int.toString 4) ^ "\n")
val _ = main ()
然后您可以通过mlton foo.sml
编译它,这将生成一个名为“foo”的可执行文件。当您运行它时,它将产生以下结果:
./foo
4
this is the main function
mlton projectr.mlb
进行编译。
XYZ_XXX_BOOTLIST
。 - xiangXYZ_XXX_smlfile.sml:1.38-1.84 错误:运算符和操作数不一致 [类型不匹配] 运算符域:string * (string * string list -> OS.Process.status) 操作数: string * (string * string list -> int)
- undefined