《计算机程序的构造和解释》第 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中测试此程序确会进入死循环。)

posted on 2010-09-13 18:25  李尤  阅读(671)  评论(0编辑  收藏  举报