2 4 3 資料導向的程式設計和可加性

2021-03-31 11:40:37 字數 1671 閱讀 8662

這裡帶入了「資料導向的程式設計方式」,這種方式適合於處理某種資料(這裡是複數)有多種表達方式,而帶來的問題。

前面的2.4.2中採用的是基於型別的顯示分派,它採用一集過程作為複數算數與兩個表示包之間的介面,這種髮式有兩個弱點:1,每個過程都必須知道複數的所有表達方式;2,命名困難。兩弱點的根源是這種基於型別的顯示分配不具有「可加性」。

資料導向的程式設計,把所有的針對複數的操作,按照不同的型別和操作,將其輸入**,形成乙個二維**(如果複數不止兩種表達方式,就不止二維**)。而資料導向的程式設計就是使程式能直接利用這種**工作的程式設計方式。

在該節中的計算複數的二維**就是下圖,它的第一維是operation,第二維是資料型別.按照(get 'operation 'polar)。

我想要(define z1 (make-from-real-imag 1 2)),

程式執行不了,顯示expected procedure, given: #f

檢查原因:

1,**正常執行

2,原因在於沒有安裝程式包,安裝: (install-rectangular-package)  (install-polar-package)ok

關鍵過程:

在資料導向的程式設計中,最關鍵的想法是通過顯示處理--型別**(如上圖)的方式,管理程式中的各種通用型操作(如real-part,imag-part)。

而2.4.2節中的是一種基於型別(polar,rectangular)進行分派的組織方式,基於型別

進行分派就是讓每個操作(即通用型過程如real-part,imag-part...)管理自己的分派。

(define (real-part z)

(cond ((rectangular? z)

(real-part-rectangular (contents z)))

((polar? z)

(real-part-polar (contents z)))

(else (error "unknown type -- real-part" z))))

從效果上來講,這種方式就是將上表分成一行一行,每個通用型過程表示**中的一行。

另一種實現策略是將這一**按列進行分解,不是採用一批「智慧型操作」(即上面的通用型過程)去基於資料型別進行分派,而是採用「智慧型資料物件」,讓它們基於操作名完成所需要的分派工作。而所謂的「智慧型資料物件」也是由過程來實現,就是dispatch方式。

(define (make-from-real-imag x y)

(define (dispatch op)

(cond ((eq? op 'real-part) x)

((eq? op 'imag-part) y)

((eq? op 'magnitude)

(sqrt (+ (square x) (square y))))

((eq? op 'angle) (atan y x))

(else

(error "unknown op -- make-from-real-imag" op))))

dispatch)

這裡,make-from-real-imag返回的是乙個過程--內部的dispatch過程。這種風格稱為訊息傳遞,名字**於,將資料物件設想成乙個實體,而它以訊息的方式接收到所需操作的名字。

注意在本節中利用**進行計算時採用的是並不是訊息導向的程式設計,而是資料導向的程式設計。

Linux的資料流重導向,和管線命令

資料流重導向 redirect 名稱簡稱 使用方式 標準輸入 standard input stdin 0 將檔案的資料作為其他命令的輸入 設定輸入結束的字串 標準輸出 standard output stdout 1 覆蓋方式將正確的資料輸出 累加方式將正確的資料輸出 標準錯誤輸出 standar...

論部落格和程式設計的重要性

第一篇部落格,想了好久,不知道該寫些什麼。不止乙個人跟我說過,部落格很重要,對以後很有幫助。將你遇到的知識發到部落格上,不僅可以幫助你歸納總結,還可以幫助到別人,何樂而不為。前幾天我發現了 神奇的效果。在沒 有實訓之前,我一直都很為編寫 是為了寫題的,但是後來我想明白了,還可以做很多程式,比如 小遊...

資料結構和演算法的重要性

我們現在討論字串匹配問題,我相信沒學過演算法的同學,就直接使用暴力匹配法。這個方法很容易想到,但是效率特別的低。如果學過演算法的同學,就知道如何用最佳的方案解決此問題。那就是kmp演算法,可以用最快的速度解決。kmp演算法這裡就不討論了,如果想學的同學可以檢視詳解kmp演算法 演算法是程式的靈魂,乙...