終於有習題了,但是這次的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是比較方便的