赋值和局部状态
我们可以用一个或几个状态变量刻画一个对象的状态,在他们之中维持有关这一对象的历史,即能够确定该对象当前行为的充分的信息
局部状态变量
过程 dispatch 以一个消息为输入,返回两个局部过程之一
引进赋值带来的利益
通过引进赋值和将状态隐藏在局部变量中的技术,我们可以以一种更模块化的方式构造系统
引进赋值的代价
引入赋值 set! 和变量的值可以变化的想法,一个变量就不再是一个简单的名字了。现在的变量索引着一个可以保存值的位置,而存储在那里的值也可以变化,环境扮演着位置的角色
求值的环境模型
一个环境就是 框架 的一个序列,每个框架是包含着一些约束的一个表格(可能为空),这些约束将一些变量名字关联于对应的值。每个框架还包含一个指针,指向这一框架的 外围环境 ,如果由于当前讨论的目的,将相应的框架看作是 全局 的,那么它将没有外围环境。一个 变量 相对于某个特定环境的 值 ,也就是在这一环境中,包含着该变量的第一个框架里这个变量的约束值。如果在序列中并不存在这一变量的约束,那么我们就说这个变量在该特定环境中是无约束的
求值规则
我们可以把过程应用的环境模型总结为下面两条规则:
- 将一个过程对象应用于一集实际参数,将构造出一个新框架,其中将过程的形式参数约束到调用时的实际参数,而后在构造起的这一新环境的上下文中求值过程体。这个新框架的外围环境就是作为被应用的那个过程对象的一部分的环境
- 相对于一个给定环境求值一个 lambda 表达式,将创建起一个过程对象,这个过程对象是一个序对,由该 lambda 表达式的正文和一个指向环境的指针组成,这一指针指向的就是创建这个过程对象时的环境
内部定义
以局部过程定义作为程序模块化的有用技术中的两个关键性质:
- 局部过程的名字不会与包容他们的过程之外的名字互相干扰,这是因为这些局部过程名都是在该过程运行时创建的框架里面约束的,而不是在全局环境里约束的
- 局部过程只需将包含着它们的过程的形参作为自由变量,就可以访问该过程的实际参数。这是因为对于局部过程体的求值所在的环境是外围过程求值所在的环境的下属
用变动数据做模拟
定义了改变函数的数据对象称为 变动数据对象
变动的表结构
共享与相等
队列的表示
并发:时间是一个本质问题
并发系统中时间的性质
控制并发的机制
设法做出一些一般性的机制,使我们可能限制并行进程之间的交错情况,以保证程序具有正确的行为方式。
串行化组:
我们可以用串行化的过程给并发过程强加一些限制,通过 串行化组 来实现限制。构造串行化组的方式是调用 make-serializer ,一个串行化组以一个过程为参数,它返回的串行化过程具有与原过程一样的行为方式。对一个给定串行化组的所有调用返回的串行化过程都属于同一个集合