Lisp学习笔记(一)

来源:互联网 发布:剑三冷艳毒姐捏脸数据 编辑:程序博客网 时间:2024/06/05 08:37

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)
0 0
原创粉丝点击