这就是我所知道的:
>新泽西州的标准ML有一个交互式读取 – 评估 – 打印循环,但它的编译规则有点奇怪,而且有点慢.不过,它可能是领先的竞争者.
>莫斯科ML曾经是理想的,但它仍未提供2004年标准基础库.最不幸的是,因为除了它的许多其他优良属性外,莫斯科ML还有一个交互式帮助系统 – 但我不能给我的学生一个编译器,它的库与所有在线文档所说的不同.
> Poly / ML可能很适合这个账单,除了在线查看文档,我无法弄清楚如何编译它.那可能没问题.
目前看起来好像SML / NJ或Poly / ML是最好的折衷方案.自从我在标准ML中做了任何认真的工作已经很多年了,我希望有关其他编译器的信息,或者根据您的经验,这些替代方案中哪些是最快的交互和最容易学习使用的.
解决方法
[mtf@fenrir hamlet-1.3.1.polyml]$/usr/bin/time make with-poly ... 2.92 real 2.31 user 0.55 sys [mtf@fenrir hamlet-1.3.1.smlnj]$/usr/bin/time make with-smlnj ... 11.98 real 11.08 user 0.78 sys [mtf@fenrir hamlet-1.3.1.mlton]$/usr/bin/time make with-mlton ... 24.51 real 21.04 user 3.05 sys
在编译MLton时,Poly / ML和SML / NJ之间的差异并不那么明显(大约175779行注释的SML):
[mtf@fenrir mlton.polyml]$/usr/bin/time make polyml-mlton ... 117.67 real 112.12 user 4.87 sys [mtf@fenrir mlton.smlnj]$/usr/bin/time make smlnj-mlton ... 123.31 real 116.24 user 6.38 sys [mtf@fenrir mlton.mlton]$/usr/bin/time make mlton-compile ... 238.44 real 232.01 user 5.49 sys
作为REPL,Poly / ML和SML / NJ几乎相同.我发现来自SML / NJ的错误消息要好一些;他们倾向于拥有更具体的来源地点.当然,当用作REPL时,SML / NJ的源位置是stdIn,对于这些行号,行号并不是非常有用.
如果你的学生只打算使用REPL或编译单个文件程序,那么我会想象Poly / ML或SML / NJ可以满足你的需要.两者都提供SML使用功能.多文件程序最好由SML / NJ的编译管理器或MLton的ML Basis系统提供; Poly / ML提供了另一个编译系统(PolyML.make),但我从未使用它.
编译Poly / ML有什么困难?从5.0版开始,Poly / ML支持简单的./configure;制造make install build.使用Poly / ML 5.X编译独立的可执行文件需要使用PolyML.export并调用C编译器,但在5.0版发行说明中对此进行了详细描述.