以下是对于 MIT SICP 课程影片(lec 5b)的心得记录,part 1 为 [开始~31:00] 左右
当我们要开发一组非常複杂的程式,且让程式可以被修改,对应真实世界的改变是对于思考比较经济的,就是OOP物件导向的设计方式。
最完美的系统就是电气系统,电气系统有个非常棒的特性,每个部件都是个别的物件,而连接起来的电线非常清楚可见,非常重要的部分就是它们的关联一目了然,一个灯泡接上电,电线的连接就是已知的关联了,这样是非常好作抽象的,可以清楚地在纸上画出关係,废话不多说,就让我们开始来做一个电气系统的程式吧。
构建 数位电路:
基本元素:
右边三个图片是数位电路中的基本元件,Inverter, And-gate, Or-gate、wire,用wire(在系统当中代表电压、电流信号)将其串在一起,形成电路系统。
make-wire
所产生。以or-gate为例子,or-gate接收两个input a, b,输出output d,其他的元件以此类推。抽象:
拥有以上的基本元件之后,就可以在组合出其他更大型的元件,如 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-gate
and-action-procedure
,当中利用的参数就是从and-gate环境中binding的a1, a2, output。wire
恩...好複杂
set-my-signal
定singal成新的值,且呼叫每一个 action-procs
还有add-action-proc
,增加新的AP定义dispatch
,将信号分派给wire其实wire是一个接收signal然后产生proceduer的object,比如接收一个 "给我一个可以增加AP的procedure" ,wire回传
add-action-proc
,让request的人拿去用。其他
这里可以看到 get-signal, set-signal!, add-action!
都是给一个字串去call wire
来完成工作,有点像是经过一个 "许可" 的感觉。
时间、顺序
实际上的电路会有些 "延迟",如何实现这些延迟与顺序呢?
the-agenda
procedure来实现每个action出现的顺序由 propagenate
来控制它数位电路模拟系统
完成如下:
小结
上述内容中可以看到,如何使用设计系统使其对应真实的物件
系统最重要的三个部分:基本元件、抽象、组合所有拿取、修改state的方法都被包在wire
里面,要对state做动作,需要一个 "许可" 来获取function。不需要特别定义资料结构,有lambda就可以时间、顺序的实现需要特别注意(待part 2讲解)