“野生”与“家养”的差别不在于学位,而在于对经典的理解。
用Lisp方言——Scheme——来描述“基于类型的程序设计”,可真是件奇妙的事。
虽然只阅读了前3章——程序设计,但我已然获得了一种的“升华”,“锐变”(后2章——解释器与编译器的实现)留待年后了。
文摘
计算机永远都不够大也不够快,硬件技术的每一次突破都带来了更大规模的程序设计事业,新的组织原理,以及更加丰富的抽象模型。
金字塔矗立在那里千年不变,而有机体则必须演化,否则就会死亡。
“完全展开而后归约”的求值模型称为正则序求值,“先求值而后应用”的求值模型称为应用序求值。
一个过程是递归的,论述的是一个语法形式上的事实——这个过程的定义中(直接或间接地)引用了该过程本身。递归计算过程与迭代计算过程表达的是计算过程的进展方式。
高阶过程的重要性,就在于使我们能显示地利用程序设计语言的要素去描述这些抽象,像操作其它计算元素一样去操作它们。
数据抽象的基本思想就是为每一类数据对象标识出一组操作,使得对这类数据对象的所有操作都可以基于它们表述,而且在操作这些数据对象时也只使用它们。
闭包,来自抽象代数,一集元素称为在某个运算(操作)之下封闭,如果将该运算应用于这一集合的元素,产生出的仍然是该集合里的元素。闭包性质是任何一种组合功能的威力的关键要素。
过程中的耦合是由——将枚举器(map)的工作散布在过程中的各处,并与映射、过滤器(filter)、累积器(reduce)混和——的原因,而产生的。
一个复杂的系统应该通过一系列的层次构造出来,为了描述这些层次,需要使用一系列的语言。构造各个层次的方式,就是设法组合起作为这一层次中部件的各种基本元素,而这样构造出的部件又可以作为另一个层次里的基本元素。在分层设计中,每个层次上所用的语言都提供了一些基本元素、组合手段,还有对该层次中的适当细节做抽象的手段。
数据对象可以有多种表示方式,通过通用型过程,将描述数据操作的代码连接到几种不同表示上。
在设计大型系统时,处理好一大批互相有关的类型而同时又能保持模块性,这是一个非常困难的问题,也是当前正在继续研究的一个领域。
第一种策略将注意力集中在对象上,将一个大型系统看成一大批对象,它们的行为可能随着时间的进展而不断变化。另一种组织策略将注意力集中在流过系统的信息流上,非常像电子工程师观察一个信号处理系统。
在基于对象的途径中,在处理对象、变化和标识时,各种困难的基本根源在于我们需要在 环境模型中与时间搏斗。
在基于流处理的途径中,能够松解对时间的模拟与计算机求值过程中的各种事件发生的顺序。
求值的环境模型:
将一个过程对象应用于一集实际参数,将构造出一个新框架,其中将过程的形式参数约束到调用时的实际参数,而后在构造起的一新环境的上下文中求值过程体。这个新框架的外围环境就是作为被应用的那个过程对象的一部分的环境。
相对于一个给定环境求值一个lambda表达式,将创建起一个过程对象,这个过程对象是一个序对,由该lambda表达式的正文和一个指向环境的指针组成,这一指针指向的就是创建这个过程对象时的环境。