Есть ли способ уменьшить детализацию схемы MIT? - PullRequest
0 голосов
/ 05 июня 2018

Недавно я решил начать играть в MIT Scheme, следуя примерам SICP.Я установил схему из репозитория Ubuntu.

sudo apt-get install mit-scheme

Учитывая входной файл, который выглядит следующим образом:

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

Я запускаю схему следующим образом.

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

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.

Этот вывод кажется чрезмерным, поэтому я в настоящее время анализирую его следующим образом.

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

Есть ли собственный способ уменьшенияподробности схемы, так что я могу получить что-то похожее на приведенный выше вывод, не прибегая к внешнему процессу?

Я изучил вывод scheme --help, но не нашел никаких очевидных вариантов.


Обратите внимание, что передача имени файла в качестве аргумента не работает в 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 ]=> 

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вот, пожалуйста:

scheme --quiet < Numbers.scm 

Теперь это полностью подавит REPL, за исключением случаев, когда возникают ошибки, так что то, что явно не отображается, не будет отображаться.например.(+ 2 3) возвращает 5, но не печатает, поскольку вы не сказали его печатать.Вам нужно использовать такие процедуры, как display, чтобы распечатать информацию или вернуться к использованию REPL, единственной целью которого является отображение ваших результатов.

Первоначально я надеялся, что вы могли бы сделать:

scheme --quiet --load Numbers.scm

Но он не завершается после файла, и при добавлении --eval (exit) REPL спросит, хотите ли вы выйти.

РЕДАКТИРОВАТЬ

(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

Возможно, вы также можете сделать макрос для этого:

(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
0 голосов
/ 05 июня 2018

В качестве обходного пути,

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

Но, возможно, вы бы запустили его как файл сценария, а не поток stdin?Не уверен насчет вызова схемы MIT, что-то вроде

scheme Numbers.scm

Хотя таким образом вам придется распечатывать результаты явно, с (display) или чем-то еще, иначе они останутся незамеченными.

...