构造过程抽象
1.1程序设计的基本元素
- 基本表达形式,用于表示语言所关心的最简单的个体。
- 组合的方法,通过它们可以从较简单的东西出发构造出复合的元素。
- 抽象的方法,通过它们可以为复合对象命名,并将它们当作单元去操作。
1.1.1 表达式
(+ 3 2)(- 100 7 22)(/ 30 3 (+ 2 3))像上面这样的表达式称为组合式,用一对括号括起一些表达式,形成一个表,表示一个过程应用。在表里最左的元素称为运算符,其他元素都称为运算对象。
1.1.2 命名和环境
(define size 3)- 为
size关联一个值3
1.1.3 组合式的求值
- 对组合式的各个表达式求值。
- 将作为最左子表达式的值的那个过程应用于相应的实际参数(其他左表达式的值)。
以上为通用求值规则,除此之外还有针对特殊形式的专门规则。如(define x 1)
复合过程
- 过程(procedure)定义的一般形式:
(define (<name> <formal parameters>) <body>)<name>是一个符号,过程定义将在环境中关联于这个符号,为过程定义命名。<formal parameters>形式参数。<body>一个表达式。在应用这一过程时,这一表达式中的形式参数,将用与之对应的实际参数取代,对这样取代后的表达式求值,产生出这个过程应用的值。
(define (square x) (* x x));;调用过程(square 3)(square (square (+ 2 3)))过程应用的代换模型
- 代换的作用只是为了帮助我们领会过程调用中的情况,而不是对解释器实际工作方式的具体描述。
应用序和正则序
应用序求值:先求值参数而后应用(把所有参数表达式都求值,再把结果带入过程)可能会产生无限循环
正则序求值:完全展开而后规约(先把参数表达式原样代入过程,等到真正需要时才求值)。
条件表达式(Conditional Expression)和谓词(predicate)
- (cond)条件表达式的一般形式为:
(cond (<p1> <e1>) (<p2> <e2>) . . . (<pn> <en>))条件表达式的求值: 首先求值谓词false,那么就求值false,就去求值true为止。此时解释器就返回相应子句中的序列表达式<p>,cond的值就没有定义。
- (cond)的另一种形式
(cond . . . (else <e>));;如果前面的所有子句都被跳过,会返回最后(else)中<e>的值。- (if)表达式
(if <predicate> <consequent> <alternative>) ;;从<predicate>开始求值,如果<predicate>得到真值,解释器就去求值<consequent>并返回其值,否则它就去求值<alternative>并返回其值。-
(and <e1>...<en>)解释器将从左到右一个个求值<e>,如果某个<e>求值为假,这一(and)表达式都为假,后面的<e>也不再求值。如果所有的<e>都求出为真值,最后一个<e>的值为这一(and)表达式的值。 -
(or <e1>...<en>)解释器将从左到右一个个求值<e>,如果某个<e>求值为真,这一(or)表达式都为真,后面的<e>也不再求值。如果所有的<e>都求出为假,这一(or)表达式的值为假。 -
(not <e>)如果<e>求出的值是假,(not)表达式的值为真,否则其值为假。
(not)表达式是一个普通过程。
1.1.8 过程作为黑箱抽象
局部名
约束变量: 形式参数
自由变量: 外部环境所定义的变量
过程调用时的参数是值传递。
表达式求值,它会用当前作用域的参数的值算出一个新的结果,不会改变参数的值。如(- x 1)。
每次调用都会为参数创建新的绑定。
在同一层调用的作用域里参数的值是固定的,不会在这一层改变。
Some information may be outdated