将后续ML与SML/NJ一起使用

将后续ML与SML/NJ一起使用,sml,smlnj,Sml,Smlnj,当我看到SML/NJ最近做出了一些重大改变时,我感到非常惊喜,这是走向“继任者ML”的一部分。这似乎是SML/NJ和MLton之间的一次合作,预示着SML的未来 然而,当我尝试使用一些新功能时,我似乎遇到了一个奇怪的bug(在64位Windows7上)。为了进行测试,我在一个名为sml\u-test.sml的文件中编写了以下内容: Control.succML := true; val n = 123_456; print (Int.toString n); 当我尝试使用将其加载到REPL时,

当我看到SML/NJ最近做出了一些重大改变时,我感到非常惊喜,这是走向“继任者ML”的一部分。这似乎是SML/NJ和MLton之间的一次合作,预示着SML的未来

然而,当我尝试使用一些新功能时,我似乎遇到了一个奇怪的bug(在64位Windows7上)。为了进行测试,我在一个名为
sml\u-test.sml
的文件中编写了以下内容:

Control.succML := true;
val n = 123_456;
print (Int.toString n);
当我尝试使用
将其加载到REPL时,请使用“C:\Programs\sml\u succession\u test.sml”编译器在文件的第二行停止(该行使用了应启用的新类型的数字文本)。但是--当我立即运行与以前完全相同的
使用
命令时--它可以工作

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


总而言之,在计算
Control.succML:=true
和它生效之间似乎存在一种奇怪的延迟,这种延迟在某些上下文中发生,但在其他上下文中不发生。你知道这背后的原因和解决方法吗?

我在Mac OS X上也遇到过这种情况。不过,我所做的是在我的
sml
别名中使用
-Cparser.succml=true
标志,其行为与预期一致:

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

我现在忘了Windows的等价物是什么。您可能需要创建自己的sml包装器脚本,并将其放在
路径中sml/NJ脚本的前面。我使用了@IonutGStan的包装器脚本思想,如下所示。我创建了一个名为
SuccessorML.vbs
的VBScript程序,代码如下:

Set WS = WScript.CreateObject("WScript.Shell")
WS.RUN("sml -Cparser.succ-ml=true")
然后把图标放在我通常编程的文件夹中。当我单击它时,会弹出一个SML REPL的实例,其中已经启用了后续功能。我的系统路径上已经有sml的路径。如果没有,则必须在run命令中添加完整路径


在Windows上,命令
sml
链接到一个小的
.bat
文件。您可能可以编辑该文件,使其在启用了
succ ml
的情况下打开sml,因为我喜欢能够轻松启动sml的想法。

Windows确实有一种创建别名的方法,但我发现更自然的做法是采用您编写包装器脚本的想法,这将作为Windows用户的第二个答案。嗯,在SML和SuccML之间进行快速选择似乎是合理的。我也可以这么做。