Posted on 2007-07-20 14:32
dennis 閱讀(546)
評論(0) 編輯 收藏 所屬分類:
數據結構與算法
這一節那是相當的有趣,抽象數據的多重表示:采用標志(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,在本文開頭已經提了。