此篇为 SICP教程 6a 的笔记
接续前面说到的 赋值 是因为要建立模块,对应真实世界的物件,但却造成了很多问题,那如何不管每个物件在"时序"上的状态,又可以串连每一个物件来处理数据呢?
以之前的数位电路模拟器为例,其实不用去考虑每一个时间点下物件的状态,更宏观的看,把input的信号看成横轴为时间、纵轴为大小的"波形讯号",如下图
每一个时间下的信号(黑色点),可以直接看成一段波形信号(蓝色线)
把整体看成是一个滤波器,input是一个"波形"、output是另一个"波形",而不是在一个时间点内互相影响的小物件。
来演示一下吧
範例说明
给定一个2元树如下图,找出 节点中所有奇数的平方和


这两个範例,看似是做不一样的计算,但却有些相似之处,如果我是一个讯号处理工程师,会如何思考这两个问题


有没有非常的像呀,这就是map, accu, filter,在非讯号处理观点的部分,map, accu, filter其实都有用到,只不过分散在各个部分,导致完全看不出来。
而为什么可以用map, accu, filter来操作呢,最大的关键是所处理的信号数据结构,称为"流 streams",在clojure称为 "宏 macro"。
流 streams
是一种数据抽象,向其他数据抽象一样,可由构造函数与选择函数来描述。
构造函数:(cons-stream x y)
选择函数: (Head s)
取stream的第一个数 (Tail s)
取第一个后的所有数empty-stream:空的streamFor 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这些基本元件,让我们可以任意组合製造程序。