SICP笔记1
- 组合式:用一对括号括起一些表达式,形成一个表,用于表示一个过程的应用。
(+ 123 456)
输出:578
- 表里最左边的是运算符,形式为前缀表示。表可以直接扩充,如(1+2×3):
(+ 1 (* 2 3))
- 给事物命名用define,类似其他高级语言中的变量。
(define size 2) ;为size关联一个值,即2
(* size 5)
输出:10
- 符合过程,一般形式:
(define (<name> <formal parameters>) <body>)
举例如下:
(define (square x) (* x x))
(square 21)
输出:441
(square (+ 2 5))
输出:49
- 正则序求值:完全展开而后归约的求值模式。现代解释器实际使用的是应用序求值:先求值参数而后应用。
- 条件表达式与谓词
(cond (<p1> <e1>)
(<p2> <e2>)
...
(<pn> <en>))
举例:
;cond表示条件,pn是谓词,其被解释为真或假,类似C中的switch。
(define (abs x) ;求x的绝对值
(cond ((> x 0) x)
((= x 0) 0)
((< x 0) (- x)))) ;注意x之前有空格
求绝对值的另一种写法,类似C中的if...else:
(define (abs x)
(cond ((< x 0) (- x))
(else x)))
再有一种写法,(if <predicate> <consequent> <alternative>),如果<predicate>为真,则求值<consequent>,否则求<alternative>。类似C中的expr1 ? expr2 : expr3。
(define (abs x)
(if (< x 0)
(- x)
x))
三个常用的符合运算符,与基本逻辑运算规则相同:
(and <e1> <e2> ... <e3>)
(or <e1> <e2> ... <e3>)
(not <e1>)
用法举例:
(define (>= x y)
(or (> x y) (= x y)))
注:解释器输出的对或错为
;Value: #t ;如果错误为#f
- 局部名,类似局部变量。
(define (square x) (* x x))
(define (square y) (* y y))
这样定义解释器无法区分,无论是x或者y,对于外部来看,都没有区别,类似函数。
- 内部定义(块结构)。之所以有内部定义,因为某过程对于用户,只有某个过程是需要的,其他的都是干扰。例如牛顿法求平方根,只有sqrt是用户需要的。故我们可以采用块结构,类似函数:
(define (sqrt x)
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess x)
(average guess (/ x guess)))
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(sqrt-iter 1.0 x))
由于都在一个块结构中,x在其中传递便没有必要了,我们将x定义为内部定义的自由变量。这种方法称作词法作用域。
(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess)
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))