Search code examples
schememit-scheme

Is there a way to turn down the verbosity of MIT Scheme?


I recently decided to start playing with MIT Scheme by following along with the examples in SICP. I installed scheme from the Ubuntu repository.

sudo apt-get install mit-scheme

Given an input file that looks like this:

486
(+ 137 349)
(- 1000 334)
(* 5 99)
(/ 10 5)
(* 25 4 12)

I run scheme as follows.

scheme < Numbers.scm

It produces the following output.

MIT/GNU Scheme running under GNU/Linux
Type `^C' (control-C) followed by `H' to obtain information about interrupts.

Copyright (C) 2011 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Image saved on Sunday February 7, 2016 at 10:35:34 AM
  Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118 || Edwin 3.116

1 ]=> 486
;Value: 486

1 ]=> (+ 137 349)
;Value: 486

1 ]=> (- 1000 334)
;Value: 666

1 ]=> (* 5 99)
;Value: 495

1 ]=> (/ 10 5)
;Value: 2

1 ]=> (* 25 4 12)
;Value: 1200

1 ]=> 
End of input stream reached.
Moriturus te saluto.

This output feels excessive, so I'm currently paring it down like so.

scheme < Numbers.scm  | awk '/Value/ {print $2}
486
486
666
495
2
1200

Is there a native way to reduce the verbosity of scheme, so I can get something resembling the above output without resorting to an external process?

I have examined the output of scheme --help but did not find any obvious options.


Note that passing the filename as an argument does not appear to work in MIT-Scheme.

scheme Numbers.scm  
MIT/GNU Scheme running under GNU/Linux
Type `^C' (control-C) followed by `H' to obtain information about interrupts.

Copyright (C) 2011 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Image saved on Sunday February 7, 2016 at 10:35:34 AM
  Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118 || Edwin 3.116
;Warning: Invalid keyword: "Numbers.scm"
;Warning: Unhandled command line options: ("Numbers.scm")

1 ]=> 

Solution

  • Here you go:

    scheme --quiet < Numbers.scm 
    

    Now this will suppress the REPL entirely except when errors occur so that what is not explicitly displayed will not be displayed. eg. evaluatiing (+ 2 3) returns 5, but does not print since you have not told it to print. You need to use procedures like display to get the information printed or go back to using a REPL which sole purpose is to display your results.

    I was originally hoping you could do:

    scheme --quiet --load Numbers.scm
    

    But it does not exit after the file and adding --eval (exit) has the REPL ask if you want to quit.

    EDIT

    (define (displayln v)
      (display v)
      (newline)
      v)
    
    (displayln (+ 4 5))
    ; ==> 9, in addition you get the side effect that "9\n" is written to current output port
    

    You could also perhaps make a macro to do this:

    (define-syntax begin-display
      (syntax-rules ()
        ((_ form ...) (begin (displayln form) ...))))
    
    (begin-display
      486
      (+ 137 349) 
      (- 1000 334)
      (* 5 99)
      (/ 10 5)
      (* 25 4 12))
    ; ==> 1200. In addition you get the side effect that "486\n486\n666\n49\n2\n1200\n" is written to current output port