MosML 和MLton 都可以创建独立的二进制文件。 MosML 通过 mosmlc 命令和 MLton 通过 mlton 命令。
请注意,MLton 没有交互式循环,而是一个全程序优化编译器。这基本上意味着编译需要相当长的时间,但反过来会生成incredibly fast 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
请注意,这只是一个文件,当您有多个文件时,您需要使用MLB(ML Basis files),即MLtons项目文件,或者您可以使用cm文件然后通过mlton projectr.mlb编译它