《计算机程序的构造和解释》第 1.1 节习题解答记录
开始研习《SCIP》,把习题尽量做一做然后记录下来,使用的scheme解释器是Guile 1.8.7 ,
系统为Fedora 13. (Guile的最新版本 ftp://alpha.gnu.org/gnu/guile/guile-1.9.12.tar.gz. )
1.1:
guile> 10
10
guile> (+ 5 3 4)
12
guile> (- 9 1)
8
guile> (/ 6 2)
3
guile> (+ (* 2 4) (- 4 6))
6
guile> (define a 3)
guile> (define b (+ a 1))
guile> (+ a b (* a b))
19
guile> (= a b)
#f
guile> (if (and (> b a) (< b (* a b)))
b
a)
4
guile> (cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25))
16
guile> (+ 2 (if (> b a) b a))
6
guile> (* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
16
guile>
/*****************华丽的分割线*************************************/
1.2
guile>( / (+ 5 4(- 2(- 3 (+ 6 (/ 4 5)))))
(* 3 (- 6 2)(- 2 7)))
-37/150
/*****************华丽的分割线*************************************/
1.3 :
(define sum-of-squares (+ x y))
(define (sum-of-squares-of-biggers x y z)
(if (> x y)
(sum-of-squares x (if (> y z) y z))
(sum-of-squares y (if (> z x) z x))))
/*****************华丽的分割线*************************************/
1.4:
(define (a-plus-abs-b a b))
((if (> b 0) + - ) a b)) ;依据情况会出现分支
==> (a+b) ;这是b>0的情况
==> (a-b) ;这是b<0的情况
/*****************华丽的分割线*************************************/
1.5:
可知,由于(define (p) (p)), 如果出现了对(p)求值的情况, 就会陷入循环
scheme中的解释器本身就是应用序的,函数的求值会先对每一个参数进行求值,
然后把参数的值代入函数,若对(test 0 (p))使用应用序,那么(p)就会被求值,
进入死循环中。而正则序是“完全展开而后规约”,在展开之后,由if条件判断,然后
对0求值,由于(p)不会进行求值,最终函数可以正确返回0值。
(Guile中测试此程序确会进入死循环。)