開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション)の1(手続きによる抽象の構築)、1.1(プログラムの要素)、1.1.6(条件式と述語)の問題を解いてみる。
問題 1.1, 1.2, 1.3.
入出力結果(Terminal, REPL(Read, Eval, Print, Loop))
$ scheme
MIT/GNU Scheme running under MacOSX
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 Friday April 13, 2012 at 9:02:52 AM
Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/C 4.118
Edwin 3.116
1 ]=> 10 ; 10
(+ 5 3 4 ) ; 12
(- 9 1); 8
(/ 6 2) 3;
(+ (* 2 4) (- 4 6)); 6
(define a 3)
(define b (+ a 1)); a 3, b 4
(+ a b (* a b)); 19
(= a b); #f
(if (and (> b a) (< b (* a b)))
b
a); 4
(cond ((= a 4) 6)
((= b 4) (+ 6 7 a)); 16
(else 25))
(+ 2 (if (> b a) b a)); 6
(* (cond ((> a b) a)
((< a b) b); 4
(else -1))
(+ a 1)); 16
(/ (+ 5
4
(- 2
(- 3
(+ 6
(/ 4 5)))))
(* 3
(- 6 2)
(- 2 7))); -37/150
(define (sum-of-top-two a b c)
(cond ((and (< a b)
(< a c)) (+ (* b b)
(* c c)))
((and (< b a)
(< b c)) (+ (* c c)
(* a a)))
(else (+ (* a a)
(* b b)))))
(sum-of-top-two 2 3 4) ; 25
(sum-of-top-two 2 4 3)
(sum-of-top-two 3 2 4)
(sum-of-top-two 3 4 2)
(sum-of-top-two 4 2 3)
(sum-of-top-two 4 3 2)
;Value: 10
1 ]=>
;Value: 12
1 ]=>
;Value: 8
1 ]=>
;Value: 3
1 ]=>
;Value: 3
1 ]=>
;Value: 6
1 ]=>
;Value: a
1 ]=>
;Value: b
1 ]=>
;Value: 19
1 ]=>
;Value: #f
1 ]=>
;Value: 4
1 ]=>
;Value: 16
1 ]=>
;Value: 6
1 ]=>
;Value: 16
1 ]=>
;Value: -37/150
1 ]=>
;Value: sum-of-top-two
1 ]=>
;Value: 25
1 ]=>
;Value: 25
1 ]=>
;Value: 25
1 ]=>
;Value: 25
1 ]=>
;Value: 25
1 ]=>
;Value: 25
1 ]=> ^D
End of input stream reached.
Moriturus te saluto.
$
問題 1.4
振る舞い
(> b 0)が評価されて、 bが0より大きい場合 (define (a-plus-abs-b a b) (+ a b)) それ以外の場合 (define (a-plus-abs-b a b) (- a b))
問題 1.5
Benは、「引数を評価し、作用させる」方法の作用的順序の評価を使う解釈系では、最初に(test 0 (p))の(p)を評価をする際に無限ループ(Schemeで無限ループって言葉で合ってるのか分からない。。とりあえず、(define (p) (p))の評価がずっと終わらない。)が発生する。
「完全に展開し、簡約する評価方法」の正規順序の評価を使う解釈系では、その値が必要になるまで、非演算子を評価しないので、(=x 0)が最初に評価されて、そして0となる。((p)の値が必要になる事は無いので、(p)が評価されて無限ループになることはない。)
(Schemeは作用的順序の評価を使っているので、実際に試してみたところ、結果は前者になったので手動で終了。)
0 コメント:
コメントを投稿