这一节那是相当的有趣,抽象数据的多重表示:采用标志(tag)来区分和数据导向(data-directed)技术,稍微提了下消息传递。通过一张二维表格将类型、操作的分派机制介绍的很清楚,静态OO语言正是通过类型来决定消息的分派,而消息传递以列进行划分,每个类型都以过程来表征,也就是所谓的“智能数据对象”,两者各有优缺点。当类型增加频繁时,消息传递风格的分派更容易扩展,当操作增加频繁时,反而是显式的类型分派更为容易扩展,这一点如果有OO设计经验应该很容易体会。
看看习题:
习题2.73,将求导程序以数据导向方式进行修改:
a)题目已经说了,基于被求导表达式的类型进行分派,加法表达式或者乘法表达式都有标志来区分,而number?和variable?并没有标志进行区分,因此无法加入数据导向分派。
b)选择函数不变,将求导过程提取出来,根据表达式类型划分,然后用put过程安装:
(define (deriv
-
sum
exp
var) (make
-
sum (deriv (addend
exp
) var) (deriv (augend
exp
) var))) (define (deriv
-
prod
exp
var) (make
-
sum (make
-
product (multiplier
exp
) (deriv (multiplicand
exp
) var)) (make
-
product (deriv (multiplier
exp
) var) (multiplicand
exp
)))) (define (install
-
deriv
-
package
) (put
'
deriv
'
+
deriv
-
sum) (put
'
deriv
'
*
deriv
-
prod)
'
done)
c)我没做,不过和b差不了多少
习题2.75,很简单,跟着书上来:
(define (make
-
from
-
mag
-
ang r a) (define (dispatch op) (cond ((eq
?
op
'
real-part) (* r (cos a))) ((eq? op
'
imag
-
part) (
*
r (
sin
a))) ((eq
?
op
'
magnitude) r) ((eq? op
'
angle) a) (
else
display
"
Unknow op
"
))) dispatch)
将极角坐标系表示的复数用dispatch过程来表示,这正是消息传递风格。 习题2.76,在本文开头已经提了。
文章转自庄周梦蝶 ,原文发布时间 2007-07-20
相关资源:SICP 习题答案