Как отключить предупреждения SMLNJ? - PullRequest
5 голосов
/ 18 ноября 2011

Я пытаюсь написать сценарии командной строки, но предупреждения 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]

1 Ответ

8 голосов
/ 18 ноября 2011

Прежде всего вы захотите исправить эти предупреждения, а не просто игнорировать их. Все остальное - просто безобразная привычка!

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

Кроме того, насколько я знаю: избавиться от автозагрузки сообщений в sml / nj невозможно. Вы можете попробовать другой переводчик. Поли / мл не говорит много, однако я не могу найти способ запустить его в файл. Mosml тоже мало общается, и здесь вы можете запустить его в файле (даже, как мне сказали, даже в файле .mlb - он недокументирован).

Другим способом было бы скомпилировать ваши файлы, однако тогда цель сценариев исчезает.

Вы наткнулись на один из случаев, когда sml не является подходящим инструментом для работы.


Обновление.

Я обнаружил, что на самом деле вы можете получить некоторые пути, отключив verbose в контроллере менеджера компиляции:

;#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 каждый раз.

...