Lisp(List Processing),本书使用的是其方言之一的Scheme。
Lisp重要优点:计算过程的Lisp描述(称为过程)本身又可以作为Lisp的数据来表示和操作。
1.1 程序设计的基本元素
基本表达形式
组合的方法
抽象的方法
1.1.1 表达式
键入表达式,解释器的响应是显示其求值结果。
组合式,前缀表示,适用于任意个实参,可以直接扩充,允许组合嵌套(将各个运算对象垂直对齐)
例: (+ (* 3
(+ (* 2 4 )
(+ 3 5 )))
(+ (- 10 7 )
6 ))
结果:57。
1.1.2 命名与环境
变量:名字标识符 变量的值:变量所对应的对象 环境:解释器对名字--值对偶的储存
define命名
例:
(define pi 3.14159)
(define radius 10)
(define circumference (* 2 pi radius))
circumference
62.8318
鼓励采用递增的方式去开发和调试程序。
1.1.3 组合式的求值
求值过程是递归的,递归是一种处理层次性结构(树这样的对象)的强有力的技术。
环境就是用于确定表达式各个符号的意义,为求值过程提供一种上下文。
1.1.4 复合过程
过程定义:
(define (<name> <formal parameters>) <body>)
例:
(define (square x) (* x x))
(square 3 )
9
(define (sum-of-squares x y) (+ (square x) (square y)))
(sum-of-squares 3 4)
25
复合过程的使用方式与基本过程完全一样。
1.1.5 过程应用的代换模型
代换模型:将过程体中的每个形参用相应的实参取代之后,对这一过程体求值。 实际中,一般采用提供形式参数的局部环境的方式,产生“代换”效果;简单的模型,面对“变化的数据”时将不实用。
正则序:完全展开而后归约的求值模型
应用序:先求值参数而后应用。(可避免对表达式的重复求值)
1.1.6 条件表达式和谓词
谓词:返回真或假的过程,也指能求出真或假的值的表达式。
(cond (<p1> <e1>)
(<p2> <e2>)
.......
(<pn> <en>))
例:( define (abs x)
(cond ((> x 0) x)
(= x 0) 0)
(< x 0) (-x))))
( define (abs x)
(cond ((< x 0) (-x))
(else x)))
if表达式:(if <predicate> <consequent> <alternative>)
例: (define (abs x)
(if (< x 0)
(-x)
x))
逻辑复合运算符:(and <e1> <e2>...<en>)
(or <e1> <e2>...<en>)
(not <e>)
例:(define ( >= x y) //定义>=运算符
(or (> x y) (= x y)))
(define (>= x y)
(not (< x y)))