以下是對於 MIT SICP 課程影片(lec 5b)的心得記錄,part 1 為 [開始~31:00] 左右
當我們要開發一組非常複雜的程式,且讓程式可以被修改,對應真實世界的改變是對於思考比較經濟的,就是OOP物件導向的設計方式。
最完美的系統就是電氣系統,電氣系統有個非常棒的特性,每個部件都是個別的物件,而連接起來的電線非常清楚可見,非常重要的部分就是它們的關聯一目瞭然,一個燈泡接上電,電線的連接就是已知的關聯了,這樣是非常好作抽象的,可以清楚地在紙上畫出關係,廢話不多說,就讓我們開始來做一個電氣系統的程式吧。
右邊三個圖片是數位電路中的基本元件,Inverter, And-gate, Or-gate、wire,用wire(在系統當中代表電壓、電流信號)將其串在一起,形成電路系統。
make-wire
所產生。擁有以上的基本元件之後,就可以在組合出其他更大型的元件,如 half-adder
上面的圖可以看見一個很標準的抽象,對外的接口就是input: a,b與output s,c,且有一個邊界像盒子一樣把內部包起來,內部有兩個wire d,e,創造來連接內部元件的,d,e並沒有與外部連接。
可以再繼續組合成 full-adder
inverter
input object,inverter需要對input object(稍後解釋)說 "當你改變時,跟我說一聲",當input改變,會觸動中間那一行 add-action!
,呼叫 inverter-in
,且在裡面做set-signal!
改變output object。
and-gate(or-gate以此類推)
OO的設計方法裡,每一個元件都有自己的local state,如下:
回顧一下整個程式運行的流程
and-action-procedure
,當中利用的參數就是從and-gate環境中binding的a1, a2, output。恩...好複雜
set-my-signal
定singal成新的值,且呼叫每一個 action-procs
add-action-proc
,增加新的APdispatch
,將信號分派給wireadd-action-proc
,讓request的人拿去用。
這裡可以看到 get-signal, set-signal!, add-action!
都是給一個字串去call wire
來完成工作,有點像是經過一個 "許可" 的感覺。
實際上的電路會有些 "延遲",如何實現這些延遲與順序呢?
the-agenda
procedure來實現每個action出現的順序propagenate
來控制它完成如下:
上述內容中可以看到,如何使用設計系統使其對應真實的物件
wire
裡面,要對state做動作,需要一個 "許可" 來獲取function。