由于项目需要,学习软件Tracepro中宏操作,软件中宏操作使用Scheme语言编程,于是先学习Scheme来了解下这门语言的艺术。
笔记并不按照书上内容一步一步详细列出,写此笔记主要是用于记忆重要的需要长期复习的信息。
第一章 构造过程抽象
1. 程序设计的基本元素
每一种强有力的语言都为此提供了三种机制:
- 基本表达形式,用于表示语言所关心的最简单的个体。
- 组合的方法,通过他们可以从较简单的东西出发构造出复合的元素。
- 抽象的方法,通过他们可以为复合对象命名,并将他们当做单元去操作。
1.1 表达式
组合式:构成方式就是用一堆括号括起一些表达式,形成一个表,用于表示一个过程应用。在表中最左的元素称为运算符,其他元素都称为运算对象,要得到这种组合式的值,采用的方式就是将由运算符刻画的过程应用于有关实际参数,而所谓实际参数也就是那些对象的值。例如:
(+ 4 5)
将运算符放在所有运算对象左边,这种形式称为前缀表示。
前缀表示有两个优点:
- 1.可以完全适用于可能带有任意个实参的过程。例如:(+ 8 5 6 5 5 4)。在这里不会出现歧义,因为运算符总是最左边的元素,整个表达式的范围也由括号界定。
- 2.可以直接扩充,允许出现组合式嵌套的情况,也就是说,允许组合式的元素本身又是组合式。例如:(+ (- 8 5) (* 5 6))。
为了便于阅读,遵循一种称为美观打印的规则,如下:
1.2 命名和环境
define是我们所用的语言中最简单的抽象方法,它允许我们用一个简单的名字去引用一个组合运算的结果。在写复杂程序,也就是为了去一步步的创建出越来越复杂的计算机性对象。我们可以通过一系列交互式动作,逐步创建起所需要的名字-对象关联。这种特征鼓励人们采用递增的方式去开发和调试程序。在很大程度上,这一情况出于另一个事实,那就是,一个Lisp程序通常总是由一大批相对简单的过程组成的。
(define pi 3.1415926)
1.3 组合式求值
要求值一个组合式就必须做下面的事情
- 求值该组合式的各个子表达式
- 将作为最左字表达式(运算符)的值得那个过程应用于相应的实际参数,所谓实际参数也就是其他子表达式(运算对象)的值。
例如:
树的观点可以用来看上图这种求值过程。“值向上穿行”形式的求值形式是一类更一般的计算过程的一个例子,这种计算过程称为树形积累。
注意:求值规则里并没有处理定义。例如,对(define x 3)的求值并不是将define应用于它的两个实际参数:其中的一个是符号x的值,另一个是3.这是因为define的作用就是为x关联一个值(也就是说,这个括号内的东西并不是一个组合式)。一般性求值规则的这种例外称为特殊形式。
1.4 复合过程
程序设计语言中有一些东西是必然会出现的,其中包括:
- 数和算术运算是几本的数据和过程
- 组合式的嵌套提供了一种组织起多个操作的方法
- 定义是一个首先的抽象手段,它为名字关联相应的值。
过程定义:是一种威力强大的抽象技术,通过它可以为复合操作提供名字,而后就可以讲这样的操作作为一个单元使用。
例如:(define (squart x) (* x x))
一般形式:
(define (<name> <formal parameters>) <body>)