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