2015-05-14 16 views
8

Próbuję użyć SML/NJ i używam sml < source.sml do uruchomienia kodu, ale drukuje on za dużo informacji.Drukowanie tylko wydruku za pomocą SML/NJ

Na przykład, jest to source.sml:

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

To wyjście:

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 

Od Suppress "val it" output in Standard ML, How to disable SMLNJ warnings? i SMLNJ want to remove "val it =() : unit" from every print statement execution, mam kilka wskazówek, jak je stłumić.

mogę wykonać CM_VERBOSE=false sml < $filename i dodaje jedną linię Control.Print.out := {say=fn _=>(), flush=fn()=>()}; w kodzie, ale nadal mam pewne wiadomość:

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

Jak mogę wydrukować tylko wyjście?

Odpowiedz

2

Komenda sml jest przeznaczona do interaktywnego używania. Wydaje mi się, że lepiej byłoby budować samodzielny plik wykonywalny z twojego programu.

Istnieje kilka opcji:

  1. Jeśli powołując się na rozszerzeniach SML/NJ, lub jeśli po prostu nie można użyć innego realizację ml, można postępować zgodnie z instrukcjami w this post zbudować SML/NJ obraz sterty, który można przekształcić w samodzielny plik wykonywalny za pomocą heap2exec.

  2. Lepszą opcją może być użycie kompilatora MLton, kolejnej implementacji standardowego ML. Brakuje REPL, ale w przeciwieństwie do SML/NJ nie wymaga to żadnej płyty głównej do wygenerowania samodzielnego pliku wykonywalnego. Budynek jest tak prosty jak wydawanie:

    $ mlton your-program.sml 
    $ ./your-program 
    3628800 
    
Powiązane problemy