有没有办法拒绝麻省理工学院计划的冗长?

时间:2018-06-05 06:10:53

标签: scheme 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 :(得分:1)

作为解决方法,

scheme Numbers.scm

但也许您将其作为脚本文件而不是stdin流运行?不确定MIT Scheme调用,比如

(display)

虽然通过这种方式,您必须使用<mat-form-field> <mat-select placeholder="Select User Type" [(ngModel)]="selectedUserType" (change)="selectUserType()"> <mat-option *ngFor="let user of userTypeList" [value]="user"> {{ user.description }} </mat-option> </mat-select> </mat-form-field> 或其他内容明确打印出结果,否则它们将被忽视。

答案 1 :(得分:1)

你走了:

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