将后继机器学习与 SML/NJ 一起使用

Using Successor ML with SML/NJ

当我看到 SML/NJ 最近对 version 110.79 进行了一些重大更改时,我感到非常惊喜,这是朝着称为 Successor ML 的方向迈进的一部分。这似乎是 SML/NJ 和 MLton 之间的合作项目,预示着 SML 的未来。

但是,当我尝试使用一些新功能时,我似乎遇到了一个奇怪的错误(在 64 位 Windows 7 上)。为了尝试一下,我在名为 sml_successor_test.sml:

的文件中写入了以下内容
Control.succML := true;
val n = 123_456;
print (Int.toString n);

当我尝试使用 use "C:\Programs\sml_successor_test.sml"; 将它加载到 REPL 中时,编译器在文件的第二行停滞不前(它使用了一种应该启用的新型数字文字)。但是 - 当我立即 运行 与以前完全相同的 use 命令时 - 它起作用了。

如果先在 REPL 中使用 Control.succML := true; 然后使用 use 加载文件(从文件中删除该行之后)它 确实 工作.另一方面,如果我只是启动 SML,启用 succML,然后直接在 REPL 中赋值 val n = 123_456;,它第一次失败但随后有效。

总而言之——在评估 Control.succML := true 和它生效之间似乎存在奇怪的滞后,这种滞后在某些情况下会发生,但在其他情况下不会发生。知道这背后的原因和解决方法吗?

我也在 Mac OS X 上遇到这种情况。不过,我所做的是在我的 sml 别名中使用 -Cparser.succ-ml=true 标志,它的行为符合预期:

alias sml="rlwrap /usr/local/bin/sml -Cparser.succ-ml=true"

我现在忘记了 Windows 的等价物是什么。您可能必须创建自己的 sml 包装器脚本并将其放在 PATH.

中的 SML/NJ 之前

这是已接受答案的变体。我使用@IonutGStan 的包装脚本的想法如下。我创建了一个名为 SuccessorML.vbs 的 VBScript 程序,代码为:

Set WS = WScript.CreateObject("WScript.Shell")
WS.RUN("sml -Cparser.succ-ml=true")

并将图标放在我通常编程的文件夹中。当我单击它时,会弹出一个已启用后续功能的 SML REPL 实例。我的系统路径上已经有了 sml 的路径。如果不这样做,则必须在 运行 命令中添加完整路径。

在 Windows 上,命令 sml 链接到一个小的 .bat 文件。您可能可以编辑该文件,以便它在启用 succ-ml 的情况下打开 sml - 我喜欢能够以任何一种方式轻松启动 SML 的想法。