iT邦幫忙

0

SICP Lec5b:計算對象 (數位電路模擬器 - part 2)

  • 分享至 

  • xImage
  •  

以下是對於 MIT SICP 課程影片(lec 5b)的心得記錄,part 2 為 [31:00~ final]

Part 1部分說到,把系統當中的物件與真實世界的物件做對應,是一種思考上的經濟,當然除了物件相對應之外,真實世界按時發生的狀態變化,也需要被組織成系統中的時間,這些狀態的變化,就是需要用到 "賦值",且用一個Agenda來表示優先順序

Agenda

Agendas
(make-agenda) #產生agenda
(current-time agenda) #給出當前時間(time)
(empty-agenda? agenda) #目前agenda是否為空(true/false)
(add-to-agenda! time action) #加新的action至agenda當中
(first-item agenda) #給出第一個action
(remove-frist-item) #刪除第一個action

Agenda data structure

Agenda為一個list,由很多pair組成
https://ithelp.ithome.com.tw/upload/images/20190513/201175169Y8CmsZZ8X.png
由上可知,當call Agenda function中的任何function

  1. 會先依據time(10)找到segment
  2. 增添新的action:在segment中的queue中增加action
  3. 增加agenda:找到segment位置,修改那個segment

Queue

(make-queue) #創造新的queue
(insert-queue! queue item) #插入新項目進入queue
(delete-queue! queue) #刪除queue
(front-queue queue) #查看queue第一個元素
(empty-queue? queue) #是否為空

queue data structure

https://ithelp.ithome.com.tw/upload/images/20190513/20117516KiyWyvrnB8.png
多加了一個rear尾部的指針,因為如果想從尾部增加item,就不用從head開始找起
執行 delete-queue實際上就是把要刪除的item指針指向它的下一個item,就這麼簡單
執行 insert-queue就是先創造一個 內涵新item的pair,把更改指針指向它

set-car, set-cdr

由上述Agenda, queue可知,一切更改state的源頭就是去更改那些指針,因此最基礎改變state的源頭就是兩個function set-car set-cdr

如何實現這兩個funciton,請看 Identity? of objects (SICP lec5b)

最後會發現cons, car, cdr, pair這些 data structure,並不需要一個data structure的容器容納,只需要 Lambda


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言