语言的三个机制:
- 基本表达式 (primitive expression)
- 组合 (combination)
- 抽象 (abstraction)
组合式:由括号括起的一些表达式,形成的表。表中最左边的元素称为运算符(operator),其他元素称为运算对象(operand)。
过程定义的一般形式:(define (<name> <formal parameters>) <body>)
应用序(application order):求值参数而后应用
正则序(normal order):完全展开而后归约
特殊形式(special form):
1 (define (<name> <formal parameters>) <body>) 2 (cond (<p1> <e1>) 3 (<pn> <en>)) 4 (if <predicate> <consequent> <alternative>) 5 (and <e1> ... <en>) 6 (or <e1> ... <en>) 7 (not <e>)
部分习题:
exercise 1.3
1 (define (square-sum-of-two x y z) 2 (+ (square (max x y)) 3 (square (max z 4 (min x y)))))
exercise 1.5
1 (define (p) (p)) 2 (define (test x y) 3 (if (= x 0) 4 0 5 y)) 6 (test 0 (p))
在应用序求值中,解释器会先对各个子表达式求值。在对(p)求值时就会陷入无限循环。而正则序会先展开而后归约,(test 0 (p)) 会先展开成 if 的特殊形式,再根据 if 的求值规则:谓词部分先求值,根据谓词结果选择子表达式,这样正则序求值会返回0.
exercise 1.6
Lisp使用应用序求值,而new-if不是一个特殊形式,求值过程中会不断对子表达式求值形成无限循环。
exercise 1.7
没想明白改变值相对于猜测值的比率应该怎么表示,暂时用改变值和猜测值的差代替。
1 (define (sqrt x) 2 (define (good-enough? guess) 3 (< (abs (- guess (improve guess))) 0.0001)) 4 (define (improve guess) 5 (/ (+ guess 6 (/ x guess)) 7 2)) 8 (define (sqrt-iter guess) 9 (if (good-enough? guess) 10 guess 11 (sqrt-iter (improve guess)))) 12 (sqrt-iter 1.0))
exercise 1.8
1 (define (cube-root x) 2 (define (good-enough? guess) 3 (< (abs (- guess (improve guess))) 0.0001)) 4 (define (improve guess) 5 (/ (+ (/ x 6 (square guess)) 7 (* 2 guess)) 8 3)) 9 (define (cube-root-iter guess) 10 (if (good-enough? guess) 11 guess 12 (cube-root-iter (improve guess)))) 13 (cube-root-iter 1.0))