command-line - 如何禁用 SMLNJ 警告?

标签 command-line interface sml smlnj

我正在尝试编写命令行脚本,但 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]

最佳答案

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

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

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

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

您偶然发现了 sml 不是适合这项工作的工具的情况之一。

更新。

我发现您实际上可以通过在编译管理器的 Controller 中将详细设置为关闭来获得一些方法:
;#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每一次。

关于command-line - 如何禁用 SMLNJ 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186848/

相关文章:

shell - 将终端命令保存到打开时在终端中运行命令的文件

swift - 如何在 Swift 中导入没有 Xcode 项目的模块

c - 如何在不停止 C 程序的情况下按下最后一个键?

java - 在 UML 中,如果接口(interface)与类有关系,这种关系是否也适用于实现它的任何类?

java - 如何从方法中的内部接口(interface)返回值?

function - 这些功能有何不同?

structure - 结构内部的签名

gradle - 如何从命令行配置JaCoCo Gradle插件

java - java继承抽象类需要重新实现接口(interface)的所有方法吗?

functional-programming - 与实数的模式匹配(标准 ML)