SICP ex2-45

終於有習題了,但是這次的primitive put 和 get 會報錯,代碼無法測試,所以不給出代碼

2.45要求將之前的求導函數利用添加type的方式進行選擇 type 則根據運算符來加

問題爲什麼不把constant以及same-variable一併放到data-directed的程序中

首先我們比較constant以及same-variable 發現一個需要兩個參數,一個需要一個參數,而我們利用data-directed進行過程選取,最後的過程需形式保持一致

故而,我們不將constant放入其中,那麼我們再來考慮same-variable 由於選取需要時間,而該函數的使用次數較多,故而我們將其不放入其中以提高程序運行效率

另外same-variable缺少操作符,我們無法進行operator操作

第二問,要求寫出sums 和products

首先我們將建立一張table 然後我們根據運算符號獲取程序,然後將之前的product?的程序放入該程序中即可 sum類似

第三問過程作爲table 類似第二問

第四問將 (get (operator exp) 'derive) 參數交換,我們發現2列的table 變爲2行的table

2.46

一個應用問題,問題是不同分部採用數據結構不同,所以無法利用相同的過程進行信息獲取

我們採用data-directed的思想可以解決

我們將該分行的數據結構信息提取的過程作爲table item的結果,將分行作爲一個關鍵詞,將要索引的內容爲另一個關鍵詞,那麼我們就可以實現索引了

例如我們要索引get-record獲取某僱員的record 首先我們要傳分部的type作爲索引值,其次,我們要傳遞record作爲索引值,

這樣我們就獲取了一個item (該分部的僱員的record查詢)之後我們只要將僱員id之類的key值所謂索引即可查詢

要實現以上功能,我們需要如下規定:

首先我們的個分部的文件結構需包含該分部的標籤type 用來作爲table索引值之一

其次我們的文件結構需要包含該結構是用於查詢哪個項目的標籤type作爲table的另一個索引值,例如record

作爲這個結構需要能夠接受查詢參數id之類的用以數據查詢

現在假如我們要設計針對一個特定僱員查詢其所在各分部的文件的record記錄,那麼我們可以建立一張各分部type表,然後依次傳遞至之前的record查詢過程,

我們就可得到結果

最後是如果新併購一個公司,我們只需要將該公司的標籤以及所含查詢項過程合併入table (put 'new-division 'record new-division-record)即可

最後主要介紹了消息傳遞機制

以下是2-47所要求的代碼

(define (make-polar r a)
        (define (dispatch m)
                (cond
                        ((eq? m 'real-part) (* r (cos a)))
                        ((eq? m 'imag-part) (* r (sin a)))
                        ((eq? m 'magnitude) r)
                        ((eq? m 'angle    ) a)))
        dispatch)

該代碼需配合operate使用,可代替real-part之類的函數過程

最後考慮:

本節三小節介紹的三種方法哪種適合加入數據類型,哪種適合加入操作類型

顯然第一種加入數據類型需在每一個selecotor中添加一個數據類型判斷比較麻煩

第二種則只需將表單擴建一列

第三種則新加一個make-new-data-type函數

顯然2,3是比較方便的

考慮添加操作類型

第一種是添加一個操作函數

第二種是表單擴建一行

第三種則需要在每個make函數中添加一個判斷語句

顯然1,2是比較方便的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章