使用Successor ML和SML / NJ

时间:2016-01-01 17:09:19

标签: sml smlnj

当我看到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和生效时之间似乎存在一个奇怪的滞后,在某些情况下会发生滞后而在其他环境中不会发生滞后。知道这背后是什么以及任何解决方法吗?

2 个答案:

答案 0 :(得分:2)

在Mac OS X上也会发生这种情况。但是,我所做的是在我的-Cparser.succ-ml=true别名中使用sml标志,其行为符合预期:

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

我现在忘了Windows的等价物。您可能必须创建自己的sml包装器脚本并将其放在PATH中的SML / NJ脚本之前。

答案 1 :(得分:2)

这是已接受答案的变体。我使用@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的想法。