此篇為 SICP教程 6a 的筆記
接續前面說到的 賦值 是因為要建立模塊,對應真實世界的物件,但卻造成了很多問題,那如何不管每個物件在"時序"上的狀態,又可以串連每一個物件來處理數據呢?
以之前的數位電路模擬器為例,其實不用去考慮每一個時間點下物件的狀態,更宏觀的看,把input的信號看成橫軸為時間、縱軸為大小的"波形訊號",如下圖
每一個時間下的信號(黑色點),可以直接看成一段波形信號(藍色線)
把整體看成是一個濾波器,input是一個"波形"、output是另一個"波形",而不是在一個時間點內互相影響的小物件。
來演示一下吧
而為什麼可以用map, accu, filter來操作呢,最大的關鍵是所處理的信號數據結構,稱為"流 streams",在clojure稱為 "宏 macro"。
是一種數據抽象,向其他數據抽象一樣,可由構造函數與選擇函數來描述。
(cons-stream x y)
(Head s)
取stream的第一個數 (Tail s)
取第一個後的所有數For Any x, y
(Head (con-stream x y)) -> x
(Tail (con-stream x y)) -> y
Map
Filter
Reduce
使用了 map, accu, filter後
變成Streams的處理之後,可以看到處理的過程一目瞭然,而且可以根據需求快速的變動,由於建立了一個"約定的接口"有streams, map, accu, filter這些基本元件,讓我們可以任意組合製造程序。