閱讀40 返回首頁    go 技術社區[雲棲]


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

最後更新:2017-05-17 16:01:30

  上一篇:go  http://www.blogjava.net/killme2008/archive/2007/07/23/131788.html
  下一篇:go  關於靜態與動態之辯的一點想法