2015-05-14 17 views
8

Sto tentando di utilizzare SML/NJ e utilizzo sml < source.sml per eseguire il codice, ma stampa troppe informazioni.Stampa solo output di stampa con SML/NJ

Per esempio, questo è il source.sml:

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

Questa è l'uscita:

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 

Da Suppress "val it" output in Standard ML, How to disable SMLNJ warnings? e SMLNJ want to remove "val it =() : unit" from every print statement execution, ho avuto alcuni suggerimenti su come sopprimerli.

eseguo CM_VERBOSE=false sml < $filename e ha aggiunto una riga di Control.Print.out := {say=fn _=>(), flush=fn()=>()}; nel codice, ma ho ancora qualche messaggio:

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

Come posso stampare solo l'uscita?

risposta

2

Il comando sml deve essere utilizzato in modo interattivo. Mi sembra che sarebbe meglio costruire un eseguibile standalone dal tuo programma.

Ci sono alcune opzioni:

  1. Se si fa affidamento sulle estensioni SML/NJ, o se semplicemente non si può utilizzare un altro implementazione ML, è possibile seguire le istruzioni riportate in this post per costruire uno SML/NJ immagine heap che può essere trasformata in un eseguibile standalone utilizzando heap2exec.

  2. Un'opzione migliore potrebbe essere utilizzare il compilatore MLton, un'altra implementazione di Standard ML. Manca un REPL, ma a differenza di SML/NJ non richiede alcun file standard per generare un eseguibile standalone. Costruire è semplice come l'emissione:

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