用高阶函数做抽象
- 过程提供了这样的能力:
- 能为公共的模式命名,建立抽象;
- 直接在抽象的层次上工作。
- 如果不同的过程具有同样的设计模式,可以将这种模式提取出来构成高阶过程:
- 它以过程为参数,以不同的过程参数调用可以实现前面所讲的具有相同设计模式 的不同的过程的功能;
- 可以将过程作为返回值;
- 是强有力的抽象机制,极大地增强语言的表述能力。
过程作为参数
- 以序列求和中的抽象模式引出以过程作为参数的主题。
练习 1.29-1.33
1.29
|
|
1.30
|
|
1.31
|
|
1.32
|
|
1.33
|
|
用 lambda 构造过程
- lambda:
- 用与 define 同样的方式创建过程,除了不为有关过程提供名字之外,两者创建 的过程完全一样;
- 仅有的不同之处就是这种过程没有与环境中的任何名字相关联;
- lambda 表达式可以用在任何通常使用过程名的上下文中。
- let:
- let 表达式只是作为其基础的 lambda 表达式的语法外衣罢了;
- let 使人能在尽可能接近其使用的地方建立局部变量约束;
- let 表达式描述的变量的值是在 let 最终创建的作用域之外计算的。
练习 1.34
1.34
|
|
过程作为一般性的方法
- 一般性(general)方法的两个更精细的实例:
- 找出函数零点;
- 找出函数不动点;
- 一般性过程与其中涉及的特定函数无关,只要函数都符合一般性过程要求的特征 (如参数个数,返回值类型等),而不用考虑函数到底是怎样进行特定计算过程的。
练习 1.35-1.39
1.35
|
|
1.36
|
|
1.37
|
|
1.38
|
|
1.39
|
|
过程作为返回值
- 创建一种其返回值本身也是过程的过程,能使程序设计语言得到进一步的表达能力;
- 将一个计算过程形式化为一个过程,一般来说存在很多不同的方式,有经验的程序 员知道如何选择过程的形式,使其特别地清晰且易理解,使该计算过程中有用的元 素能表现为一些相互分离的个体,并使它们还可能重新用于其他的应用;
- 复合过程作为一种至关重要的抽象机制,使我们能将一般性的计算方法明确描述为 这一程序设计语言中的的元素,高阶函数可以操作这些一般性的方法以便建立起进 一步的抽象;
- 编程者应该对第3条所述的可能性保持高度敏感,设法从中识别出程序里的基本抽象, 基于它们去进一步构造,并推广它们以创建威力更加强大的抽象。;
- 在工作中选择合适的抽象层次,但重要的是能基于这种抽象去思考;
- 高阶过程的重要性,在于使我们能显式地将这些抽象描述为程序设计语言的要素, 使我们能像操作其他计算要素一样去操作它们;
- Lisp 给了过程完全的第一级状态(一等公民)。
练习 1.40-1.46
1.40
|
|
1.41
|
|
1.42
|
|
1.43
|
|
1.44
|
|
1.45
|
|
1.46
|
|