tags:

views:

195

answers:

2

I'm writing a "script" in Standard ML (SML/NJ) that sets up the interactive environment to my liking. The last thing the script does is print out a message indicating everything went smoothly. Essentially, the last line is this:

print "SML is ready.\n";

When I run the script, all goes well but the SML interpreter displays the return value from the print function.

SML is ready.
val it = () : unit
-

Since I'm merely printing something to the screen, how can I suppress the "val it = () : unit" output so that all I see is the "SML is ready" message followed by the interpreter prompt?

+5  A: 

To surpress the SML-NJ prompt and response, use the following assignment.

Compiler.Control.Print.out := {say=fn _=>(), flush=fn()=>()};
print "I don't show my type";

I don't show my type

although I don't see why the print function returning the type is bad.

The say function controls what is printed out.

There is a larger example in the following SML/NJ notes http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf

The useSilently function can be used to load a file but without displaying any output associated with the loading

fun useSilently (s) = let
val saved = !Compiler.Control.Print.out
fun done () = Compiler.Control.Print.out := saved
in
Compiler.Control.Print.out := {say = fn _ => (), flush = fn () => ()}
(use (s); done ()) handle _ => done ()
end

This is essentially changing the say function to do nothing and then setting it back at the end.

pjp
A: 

I don't know how SML works, but in the F# Interactive window the 'val it' doesn't get printed if you enter more than one expression. Try the following:

print "line one" print "line two"

Or must you enter exactly one expression in the SML interactive console?

Chris Smith
It won't print the "val it" for the first expression, but it will for the second.
Barry Brown