- 《计算机程序的构造和解释》,原书第二版,Structure and Interpretation of Computer Programs,SICP。
- 豆瓣读书:https://book.douban.com/subject/1148282/
这本神作,目前看完了第 1 章,习题还没来得及做。名不虚传啊,很多真知灼见的金句,还有很多思想都是醍醐灌顶的。第一章里主要是讲了 Lisp 语言的一些基础性的概念,以及程序开发中的基本思想。书里用到不少数学的思想,高中数学扎实,理解起来就相对轻松一些。第 1、2、3 小节,层层深入。现在回过头来看第 1 章的标题,“构造过程抽象”,才明白他说的是什么。
序、前言
Pascal 为了建造金字塔——壮丽辉煌、令人震撼,是由各就其位的沉重巨石筑起的静态结构。而 Lisp 则是为了建造有机体——同样地壮丽辉煌并令人震撼,由各就其位却永不静止的无数简单的有机体片段构成的动态结构。
一个计算机语言并不仅仅是让计算机去执行操作的一种方式,更重要的,它是一种表述有关方法学的思想的新颖的形式化媒介。
计算机革命是有关我们如何去思考的方式,以及我们如何去表达自己的思想的一个革命。
数学为精确处理“是什么”提供了一种框架,而计算则为精确处理“怎么做”的概念提供了一种框架。
第 1 章 构造过程抽象
- 计算过程
- 这是基本概念,也是本章的主题。可以理解为一段计算机操作指令,一组规则组合,一个函数,一个程序语言描述的算法……
1.1 程序设计的基本元素
- 前缀表示的组合式表达式。
- 使用 define 关键字定义变量与过程(函数)。其中定义一个过程,成为生成一个复合过程。
- 计算组合式表达式可以是递归的计算过程或者是树形积累的计算过程。
- 复合过程在其他过程中的引用于计算,称为代换模型。
- 关键字 cond 与 if 可以构造条件表达式。and、or、not 关键字可用于谓词计算。
1.2 过程与它们所产生的计算
- 递归计算过程与迭代计算过程。需要注意的是,有些过程是使用递归过程来描述的,而他对应的计算过程却可能是一个迭代计算过程。(P23)
- 树形递归。
- 增长的阶。我们称 R(n) 具有 θ(f(n)) 的增长阶,记为 R(n)=θ(f(n))(读作 f(n) 的 theta)。这个其实对应算法里的时间、空间复杂度。
1.3 用高阶函数做抽象
- 高阶过程,我们需要构造出这样的过程,它们以过程作为参数,或者以过程作为返回值。
- 公共的基础模式,由此可以先构造出一个过程,作为模板,然后从参数传入具体的特异化的过程,来应用在这个公共基础模式上。(P39)
- lambda 方法。一般而言,除了不为有关过程提供名字,lambda 与 define 使用同样的方式构造过程。
- let 关键字的使用方法比 lambda 更进一步,可以在不带名字的过程中定义局部变量。
- 过程作为返回值,一个过程(函数)接受一个参数过程 f,把他应用于过程内部的另一个由 lambda 产生的过程,并返回这个由 lambda 产生的过程,然后返回的这个过程马上就可以应用于参数 x。真是十分的绕,可以结合下面的例子来理解:
; 返回一个过程的一个过程定义:
(define (average-damp f)
(lambda (x) (average x (f x)))
; 该过程的应用。求 10 与 100 的平均数,结果为 55:
((average-dump square) 10)
廖杰良 - 2019-03-03