没有合适的资源?快使用搜索试试~ 我知道了~
首页Lisp语言入门.pdf
资源详情
资源评论
资源推荐

Lisp 语言入门
Lisp 是一门历史悠久的语言,全名叫 LISt Processor,也就是“表处理语言”,它是由 John
McCarthy 于 1958 年就开始设计的一门语言。和 Lisp 同时期甚至更晚出现的许多语言如 Algo 等如今大
多已经消亡,又或者仅仅在一些特定的场合有一些微不足道的用途,到现在还广为人知的恐怕只剩下了
Fortran 和 COBOL。但唯独 Lisp,不但没有随着时间而衰退,反倒是一次又一次的焕发出了青春,从
Lisp 分支出来的 Scheme、ML 等语言在很多场合的火爆程度甚至超过了许多老牌明星。那么这颗常青树
永葆青春的奥秘究竟在哪里呢?
如果你只接触过 C/C++、Pascal 这些“过程式语言”的话,Lisp 可能会让你觉得十分不同寻常,首先吸
引你眼球(或者说让你觉得混乱的)一定是 Lisp 程序中异常多的括号,当然从现在的角度来讲,这种设计
的确对程序员不大友好,不过考虑到五六十年代的计算机处理能力,简化语言本身的设计在那时算得上是当
务之急了。
Lisp 的基本语法很简单,它甚至没有保留字(有些语言学家可能对这一点有异议,别怕,我听你们的),它
只有两种基本的数据,仅有一种基本的语法结构就是表达式,而这些表达式同时也就是程序结构,但是正如
规则最简单的围棋却有着最为复杂的变化一样,Lisp 使用最基本的语言结构定义却可以完成其它语言难于实
现的、最复杂的功能。
废话少说,现在我们就来看看 Lisp 语言中的基本元素。
Lisp 的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如 abc;表是由零个或多个表
达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:
abc
()
(abc xyz)
(a b (c) d)
最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。
正如算数表达式 1+1 有值 2 一样,Lisp 中的表达式也有值,如果表达式 e 得出值 v,我们说 e 返回 v。如
果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。

正如欧几里德的几何世界中有五个公理一样,我们在这里给出 Lisp 世界中的 7 个公理(基本操作符):
(quote x)返回 x,我们简记为'x
(atom x)当 x 是一个原子或者空表时返回原子 t,否则返回空表()。在 Lisp 中我们习惯用原子 t 表示真,而
用空表()表示假。
> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t
现在我们有了第一个需要求出自变量值的操作符,让我们来看看 quote 操作符的作用——通过引用
(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom 将其视为代码,例如:
> (atom (atom 'a))
t
反之一个被引用的表仅仅被视为表
> (atom '(atom 'a))
()
引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了 Lisp 最为与众不
同的特点——代码和数据使用相同的结构来表示,而我们用 quote 来区分它们。
(eq x y)当 x 和 y 的值相同或者同为空表时返回 t,否则返回空表()
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t
下一章,我们将讲解与表相关的操作符和条件操作符,以及 Lisp 程序的基本元素——函数。
一集我们讲了 Lisp 世界七个公理的前三个,这一集我们接着讲剩下的四个。
首先是三个表操作

(car x)要求 x 是一个表,它返回 x 中的第一个元素,例如:
> (car '(a b))
a
(cdr x)同样要求 x 是一个表,它返回 x 中除第一个元素之外的所有元素组成的表,例如:
> (cdr '(a b c))
(b c)
(cons x y)要求 y 是一个表,它返回一个表,这个表的第一个元素是 x,其后是 y 中的所有元素,例如:
> (cons 'a '(b c))
(a b c)
> (cons 'a (cons 'b (cons 'c ())))
(a b c)
看到这里大家可能会问,为什么没有取表中除开头外其它某个位置上的元素的操作符,别急,等我们讲到地
球人都知道的函数和递归你就知道该怎么办了,也许你现在已经想得差不多了?
接下来要介绍给大家的是构成程序逻辑的一个基本功能……条件分支,在 Lisp 中,它是由 cond 操作符完成
的,cond 是七个公理中最后一个也是形式最复杂的一个(欧几里德的最后一个公理也如是):
(cond (p1 e1) (p2 e2)...(pn en))
p1 到 pn 为条件,e1 到 en 为结果,cond 操作符依次对 p1 到 pn 求值,直到找到第一个值为原子 t(还
记得吗?)的 p,此时把对应的 e 作为整个表达式的值返回,例如:
> (cond ((eq 'a 'b) 'first)
((atom 'a) 'second))
second
好了,至此我们已经有了 Lisp 世界的所有基本公理,我们可以开始构建整个世界的规则了。
在这七个操作符中,除 quote 和 cond 之外,以其他的五个操作符开头的表达式总是要对它的所有自变量
求值,然后产生结果,我们把这样的表达式叫做函数。
剩余13页未读,继续阅读











安全验证
文档复制为VIP权益,开通VIP直接复制

评论1