【问题标题】:How to disable SMLNJ warnings?如何禁用 SMLNJ 警告?
【发布时间】:2012-01-01 11:28:53
【问题描述】:

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

【问题讨论】:

    标签: command-line interface sml smlnj


    【解决方案1】:

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

    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

    【讨论】:

    • 是否有~/.sml 配置文件可以禁用这些警告?
    • 那将独立于您使用的解释器。我有更新需要这样的功能,所以我不确定,但我会说不。尝试查看 sml/nj 文档。
    • 我试过 ``` CM_VERBOSE=false sml foo.sml``` 但我收到一条错误消息:错误:语法错误:插入 VAL
    猜你喜欢
    • 2013-01-05
    • 2012-08-03
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2020-05-21
    相关资源
    最近更新 更多