Lisp是20世纪50年代后期发明的一种记法形式,是为了能够某种特定形式的逻辑表达式(递归方程)的使用做推理。它并不是一种主流语言,但是它具有许多独有的特性,这些特性使它成为研究重要程序的设计、构造,以及各种数据结构,并将其关联于支持他们的语言特征的一种极佳媒介。这些特种中最重要的就是:计算过程的Lisp描述(过程)本身又可以作为Lisp的数据来表示和操作。
Lisp演化出许多版本,这里使用的是Scheme,编译器使用DrScheme。
表达式
Scheme中的表达式是一种前缀表示:
(+ 100 200)
300
(* 4 8)
32
(* (- 9 6) (+ 7 8))
45
将表达式直接键入到解释器中,就会得到表达式下面相应的结果。
变量命名
Scheme中,通过define关键字来给变量命名。
(define PI 3.14159)
(define radius 10)
(* PI (* radius radius))
3.14159
复合过程
过程是一种抽象技术,它可以为复合操作提供名字,这样我们就可以方便的进行调用。下面是一个平方的过程:
(define (square x) (* x x))
定义好之后,我们就可以调用它:
(square 3)
9
还可以利用它去定义其他过程:
(define (sum-of-square x y)
(+ (square x) (square y))
)
为了求值一个组合式,解释器将对组合式的各个元素求值,而后将得到的那个过程应用于那些实际的参数。求值方式分为两种:
-
正则序求值。“完全展开而后规约”。
(sum-of-square (* 2 3) (+ 2 3))
(+ (square (* 2 3)) (square (+ 2 3)))
(+ (* (* 2 3) (* 2 3)) (* (+ 2 3) (+ 2 3)))
(+ (* 6 6) (* 5 5))
(+ (36 25))
61 -
应用序求值。“先求值参数而后应用”。
(sum-of-square (* 2 3) (+ 2 3))
(sum-of-square 6 5)
(+ (square 6) (square 5)))
(+ (* 6 6) (* 5 5))
(+ (36 25))
61
Lisp采用应用序求值,部分原因在于这样做可以避免对于表达式的重复求值。
下面给出一个利用牛顿法求平方根的例子:
#lang scheme
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)
)
)
(define (improve guess x)
(average guess (/ x guess))
)
(define (average x y)
(/ (+ x y) 2)
)
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001)
)
(define (square x)
(* x x)
)
(define (abs x)
(cond ((> x 0) x)
((= x 0) x)
((< x 0) (- x))
)
)
(define (sqrt x)
(sqrt-iter 1.0 x)
)
(sqrt 9)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。