曾经翻译整理的一篇LISP语言的入门文章,与大家分享. (请勿转载)
----------------------------------------------------------------
熟悉人工智能语言LISP程序设计
LISP语言的特性:
LISP语言是过去所有现存语言中最接近函数式语言的一种语言。J.McCarthy在1960年提出的最初的LISP语言完全是函数型的,后来为改善在传统计算机上的执行效率,就在流行的LISP版本中,把非应用式特性加入了语言中。LISP语言具有如下特性:
LISP程序的通常形式是一串函数定义,其后跟着一串带有参数的函数调用,函数之间的关系只是在调用执行时才体现出来。LISP中没有语句概念,也没有分程序结构或其他语法结构。语言中的一切成分都是以函数的形式给出。
在纯LISP中只有很少几个原始函数,虽然现有的LISP系统已增加了大量的内部函数,但这些新增加的函数都可以用最初的原始函数来表示。
在LISP中,程序和数据在形式上是等价的。LISP的唯一数据结构是S-表达式(表),而程序本身也是用S-表达式写的,因此可以把程序当作数据来处理,也可以把数据当作程序来执行。
递归是LISP的基础,是语言的主要控制结构,它不像大多数程序设计语言那样以迭代(循环)作为主要控制结构。LISP的递归处理是基于递归定义的数据结构。
LISP的数据结构——S-表达式
LISP是一种适合于符号处理的语言,它与一般高级语言有着很大的不同。LISP处理的唯一对象是符号表达式。这种符号表达式又称S-表达式,这里S代表符号。因此,LISP程序是对符号表达式进行加工和处理的。
原子是S-表达式的最简单情况,它可分为符号原子和数原子。符号原子是以字母开头的字母数字串,可用来表示变量、常量和函数的名字等。数原子是一串数字,在其前面可冠以符号‘-’或‘+’,分别表示负数原子和正数原子。
S-表达式定义如下:
原子是S-表达式。
如果S1和S2是S-表达式,则(S1*S2)也是S-表达式。
我们把(S1*S2)称为S-表达式的点对表示,S1、S2分别称为S-表达式的头部和尾部。应该注意,这个定义是一个递归定义。
S-表达式的表表示法:
表表示法的一般形式为:(<
S-表达式>…<
S-表达式>)其中,每个可以为原子,也可以为表。例如,(A ( B C ) ( D )
)是表。表中有三个元素,即一个原子A,两外两个是表(B C)和( D
),叫做子表。不难看出,表的结构是嵌套的,定义是递归的。我们把最外层表中元素的个数定义为该表的长度。例如,表(
A ( B C ) ( D ) )的长度为3。表元素是按次序排的,所以表是有序的,比如( A B C )不同于( B C A).
在表表示法