40
技術社區[雲棲]
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)
(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)
(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
上一篇:
http://www.blogjava.net/killme2008/archive/2007/07/23/131788.html
下一篇:
關於靜態與動態之辯的一點想法
Mybatis中傳參包There is no getter for property named 'XXX' in 'class java.lang.String'
Gson對Java嵌套對象和JSON字符串之間的轉換
DataX配置及使用
【AI手機三國殺】三星Bixby闖入戰場,AI功能集成顛覆人機交互
華棲雲與阿裏雲首推“雲上電視台”,可實現內容雲端一站式製作
企業IT運維效率低——如何破?
2017年智慧城市六大發展方向暢想
bitmap 設置圖片尺寸,避免 內存溢出 OutOfMemoryError的優化方法
linux索引節點及值(弄清十分必要)
再次來北京簽證芬蘭