sicp 2.4节小题尝试解答

这一节那是相当的有趣,抽象数据的多重表示:采用标志(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值