仅使用SML/NJ打印打印输出

pro*_*eek 9 ml sml smlnj

我正在尝试使用SML/NJ,我用它sml < source.sml来运行代码,但它打印出太多的信息.

例如,这是source.sml:

fun fac 0 = 1
  | fac n = n * fac (n - 1)
val r = fac 10 ;
print(Int.toString(r));
Run Code Online (Sandbox Code Playgroud)

这是输出:

Standard ML of New Jersey v110.77 [built: Tue Mar 10 07:03:24 2015]
- val fac = fn : int -> int
val r = 3628800 : int
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
3628800val it = () : unit
Run Code Online (Sandbox Code Playgroud)

来自标准ML中的抑制"val it"输出,如何禁用SMLNJ警告?,并且SMLNJ想要从每个print语句执行中删除"val it =():unit",我得到了一些提示如何抑制它们.

我执行CM_VERBOSE=false sml < $filenameControl.Print.out := {say=fn _=>(), flush=fn()=>()};在代码中添加了一行,但我仍然有一些消息:

Standard ML of New Jersey v110.77 [built: Tue Mar 10 07:03:24 2015]
- 3628800
Run Code Online (Sandbox Code Playgroud)

如何只输出输出?

Mar*_*all 4

sml命令旨在交互使用。在我看来,你最好从你的程序构建一个独立的可执行文件。

有以下几种选择:

  1. 如果您依赖 SML/NJ 扩展,或者如果您根本无法使用其他 ML 实现,则可以按照本文中的说明构建 SML/NJ 堆映像,该映像可以使用heap2exec转换为独立的可执行文件。

  2. 更好的选择可能是使用MLton编译器,这是标准 ML 的另一种实现。它缺少 REPL,但与 SML/NJ 不同,它不需要样板来生成独立的可执行文件。构建就像发布一样简单:

    $ mlton your-program.sml
    $ ./your-program
    3628800
    
    Run Code Online (Sandbox Code Playgroud)