2015-05-14 8 views
8

Ich versuche, SML/NJ zu verwenden, und ich verwende sml < source.sml, um den Code auszuführen, aber es druckt zu viele Informationen aus.Nur Druckausgabe mit SML/NJ drucken

Zum Beispiel ist dies die source.sml:

fun fac 0 = 1 
    | fac n = n * fac (n - 1) 
val r = fac 10 ; 
print(Int.toString(r)); 

Dies ist die Ausgabe:

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 

Von Suppress "val it" output in Standard ML, How to disable SMLNJ warnings? und SMLNJ want to remove "val it =() : unit" from every print statement execution, ich habe ein paar Hinweise, wie sie zu unterdrücken.

ich ausführen CM_VERBOSE=false sml < $filename und fügte hinzu, eine Zeile von Control.Print.out := {say=fn _=>(), flush=fn()=>()}; im Code, aber ich habe noch eine Botschaft:

Standard ML of New Jersey v110.77 [built: Tue Mar 10 07:03:24 2015] 
- 3628800 

Wie kann ich nur die Ausgabe ausdrucken?

Antwort

2

Der Befehl sml soll interaktiv verwendet werden. Es klingt für mich so, als ob Sie lieber eine eigenständige ausführbare Datei von Ihrem Programm erstellen würden.

Es gibt ein paar Optionen:

  1. Wenn Sie auf SML/NJ Erweiterungen setzen, oder wenn Sie einfach nicht einen anderen ML-Implementierung verwenden können, können Sie die Anweisungen in this post folgen einer SML/NJ zu bauen Heap-Image, das mithilfe von heap2exec in eine eigenständige ausführbare Datei umgewandelt werden kann.

  2. Eine bessere Option könnte die Verwendung des MLton Compilers sein, eine weitere Implementierung von Standard ML. Es fehlt eine REPL, aber im Gegensatz zu SML/NJ benötigt es kein Boilerplate, um eine eigenständige ausführbare Datei zu generieren. Gebäude ist so einfach wie die Ausgabe:

    $ mlton your-program.sml 
    $ ./your-program 
    3628800