2

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))
)

为了求值一个组合式,解释器将对组合式的各个元素求值,而后将得到的那个过程应用于那些实际的参数。求值方式分为两种:

  1. 正则序求值。“完全展开而后规约”。

    (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

  2. 应用序求值。“先求值参数而后应用”。

    (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)

Dr_Noooo
50 声望5 粉丝

引用和评论

0 条评论