merlin2011
merlin2011

Reputation: 75565

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 ]=> 

Upvotes: 1

Views: 433

Answers (2)

Sylwester
Sylwester

Reputation: 48745

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

Upvotes: 1

bipll
bipll

Reputation: 11940

As a workaround,

scheme < Numbers.scm | gawk '/^;Value: / { sub(/^;Value: /, ""); print }'

But maybe you'd run it as a script file rather than an stdin stream? Not sure about MIT Scheme invocation, something like

scheme Numbers.scm

Though this way you'll have to print out the results explicitly, with (display) or something, otherwise they'll go unnoticed.

Upvotes: 1

Related Questions