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)
看到这里大家可能会问 ,为什么没有取表中除开头外其它某个位置上的元素的操作符 ,别急,等我们讲到地
球人都知道的函数和递归你就知道该怎么办了,也许你现在已经想得差不多了?
接下来要介绍给
显示全部