5

我正在尝试编写命令行脚本,但 SML 的警告混淆了界面。

文档说要使用:

Compiler.Control.printWarnings := false;

但 SMLNJ 已将其重命名为:

Control.printWarnings := false;

这实际上产生了更多的打印输出。

例子:

$ cat hello.sml
print "Hello World!\n";
OS.Process.exit(OS.Process.success);
$ sml hello.sml
Standard ML of New Jersey v110.72 [built: Mon Nov 14 17:30:10 2011]
[opening hello.sml]
Hello World!
val it = () : unit
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
hello.sml:2.1-2.36 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)

相对:

$ cat hello.sml
Control.printWarnings := false;
print "Hello World!\n";
OS.Process.exit(OS.Process.success);
$ sml hello.sml
Standard ML of New Jersey v110.72 [built: Mon Nov 14 17:30:10 2011]
[opening hello.sml]
[autoloading]
[library $smlnj/compiler/current.cm is stable]
[library $smlnj/compiler/x86.cm is stable]
[library $smlnj/viscomp/core.cm is stable]
[library $smlnj/viscomp/basics.cm is stable]
[library $smlnj/viscomp/elabdata.cm is stable]
[library $smlnj/viscomp/elaborate.cm is stable]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $smlnj/viscomp/debugprof.cm is stable]
[library $SMLNJ-LIB/Util/smlnj-lib.cm is stable]
[library $smlnj/MLRISC/Control.cm is stable]
[library $SMLNJ-MLRISC/Control.cm is stable]
[library $controls-lib.cm(=$SMLNJ-LIB/Controls)/controls-lib.cm is stable]
[library $smlnj/smlnj-lib/controls-lib.cm is stable]
[autoloading done]
val it = () : unit
Hello World!
val it = () : unit
[autoloading]
[autoloading done]
4

1 回答 1

10

首先,您需要修复这些警告,而不是仅仅忽略它们。其他的都是丑陋的习惯!

print "Hello World!\n";
val _ = OS.Process.exit(OS.Process.success);

除此之外,据我所知:没有办法摆脱 sml/nj 中的自动加载消息。你可以试试其他翻译。Poly/ml 并没有说太多,但是我似乎找不到在文件上启动它的方法。Mosml 也不怎么聊天,在这里你可以在一个文件上启动它(据我所知,即使是一个 .mlb 文件——它是无证的)。

另一种方法是编译你的文件,但是这样编写脚本的目的就消失了。

您偶然发现了 sml 不是适合该工作的工具的一种情况。


更新。

我发现您实际上可以通过在编译管理器的控制器中将详细设置为关闭来获得一些方法:

;#set CM.Control.verbose false;

这摆脱了大多数,但是它仍然打印一些自动加载消息,因为它必须加载 CM.Control 结构。然后它只会关闭。然而,文档还建议您可以设置环境变量 CM_VERBOSE

CM_VERBOSE=false sml foo.sml

这使它几乎安静。使用这个来源

val _ = print "Hello World!\n";
val _ = OS.Process.exit(OS.Process.success);

生成以下输出:

$ CM_VERBOSE=false sml foo.sml 
Standard ML of New Jersey v110.72 built: Wed May 12 15:29:00 2010] 
[opening foo.sml] 
Hello World!

注意val _ = ...不要val it = () : unit每次都写。

于 2011-11-18T18:41:09.723 回答