购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 LISP语言

LISP(List Processing的缩写)语言是一种早期开发的、具有重大意义的自由软件项目。它适用于符号处理、自动推理、硬件描述和超大规模集成电路设计等,特点是使用表结构来表达非数值计算问题,实现技术简单。LISP语言已成为最有影响力,并且使用十分广泛的人工智能语言。

2.4.1 LISP语言的发展史

1960年4月,McCarthy以“递回函数的符号表达式以及由机器运算的方式(第一部)”为题,于《ACM通讯》上发表LISP设置。McCarthy的学生Steve Russell根据该论文,以IBM 704于麻省理工学院的计算机运算文中心成功执行了第一版LISP。

1962年,McCarthy及人工智能小组在LISP 1的编译基础上改良出LISP 1.5版本。

1969年9月,斯坦福大学人工智能实验室的Lynn Quam与Whitfield Diffie推出的Stanford LISP 1.6广泛地应用于使用TOPS-10系统的PDP-10计算机中。Stanford LISP 1.6版本自麻省理工学院人工智能小组更新LISP 1.5为MACLISP,以及BBN科技公司成功推出InterLisp后,逐渐被弃置。

自20世纪60年代末至80年代初,各种LISP的更新版本相继涌现,有源自加利福尼亚大学伯克利分校的Franz LISP、在AutoCAD运行的AutoLISP的前身—XLISP、犹他大学开展的Standard LISP及Portable Standard LISP、专属于LISP机器上运行的ZetaLisp、源自法国国家信息与自动化研究所的LeLisp,以及MIT人工智能实验室的Gerald Sussman与Guy Steele所的Scheme等。

1994年,美国国家标准学会(ANSI)对Common LISP语言进行了标准化。

自稳定运行的Common LISP出现起,各机构就按各自所需而开展后续LISP,包括1990年来自欧洲用户的EuLisp及自由开源的IsLisp、ACL2等。

2.4.2 LISP语言的数据结构

在LISP语言中,数据和函数都是采用符号表达式定义的,这种符号表达式称为S-表达式,它是原子和表的总称。原子分为符号原子和数原子。符号原子是指有限个大写字母和数字组成的字符串,其中第一个符号必须是字母。原子NIL和T分别表示逻辑假(或空表)和逻辑真。数原子是指一串数字,通过符号表示其正负。LISP语言有以下五大特点。

1.函数型

函数型语言的基本特点是用函数定义和函数调用构成程序。程序员用函数定义和函数调用组成的表达式来描述求解问题的算法,表达式的值就是问题的解。用FORTRAN、PASCAL和C等传统程序设计语言编写的程序是按一定顺序执行的命令序列,执行结果就是问题的解。用这些语言编程时,程序员要规定求解的顺序,即要描述控制流。而用LISP语言编程只需要确定函数之间的调用,把函数执行的细节交给LISP系统来解决。因此,LISP语言是更加面向用户的语言。

传统的程序设计语言是适应冯·诺依曼型计算机系统结构而发展起来的,LISP在冯·诺依曼型计算机上运行的效率要低一些。计算机系统结构的发展,使得函数型语言有着广阔的前景。为了适应当前微型机发展水平和程序员使用传统语言编程的习惯,LISP语言增加了许多非函数型的语言成分,如prog、go等函数。因此,LISP已不是纯函数型语言,它既具有函数语言的功能,又具有传统语言的功能。

2.递归性

递归函数是指在函数的定义中调用了这个函数本身,所有的可计算函数已被证明都可以用递归函数的形式来定义。

由于LISP的主要数据结构是表,而且表是用递归方法定义的,即表中的一个元素也可以定义为一个表,因此,程序员用LISP提供的自定义函数来定义用户自己的函数时,可以用递归函数的形式来定义自己的函数。自定义的递归函数能够很方便地对递归定义的表进行操作。递归定义的方法使程序简明、优美,程序员应充分利用递归程序设计方法。

3.数据与程序的一致性

LISP的一段程序是用户的一个自定义函数,这个函数可被其他函数调用,或者说,一段程序可被其他程序调用。函数执行后的输出数据称为这个函数的返回值。一个函数被其他函数调用,就是调用了这个函数的返回值。在LISP中,函数与这个函数的返回值是一致的。这一特点使得LISP的编程就是定义一个宏函数,也使得LISP语言的扩充比较容易。可以根据应用领域的需要,使用LISP提供的基本函数扩充若干面向专门应用领域的宏函数。

4.自动进行存储分配

用LISP语言编程时,程序员完全可以不考虑存储分配问题。程序中定义的函数、数据和表等都能在程序运行时,由LISP自动提供。对不再需要的数据,LISP自动释放其占用的存储区。

5.语法简单

LISP的语法极其简单,对变量和数据不需要事先定义和说明类型。LISP语言的基本语法就是函数定义和函数调用。因此,LISP语言的程序便于修改、调试和纠错,可以边实验边设计,通过不断修改和增加用户自定义函数来构成复杂的系统。

LISP语言不仅在专家系统和CAD领域有广泛的应用,在符号代数、定理证明、机器人规划等领域也有广泛的应用。影响LISP语言使用的主要原因有:一是LISP是非可视化语言;二是LISP在通用计算机上的运行效率较低;三是LISP的数值计算能力较差;四是人们对函数型语言的编程风格不习惯。

2.4.3 LISP语言常见版本

LISP语言版本很多,常用的有如下几种。

1.MACLISP语言

MACLISP语言于1971年由MIT人工智能实验室开发,它比较注重效率、地址空间的保护和构造工具的灵活性。

2.INTERLISP语言

INTERLISP语言于1978年由DEC和XEROX公司开发,它强调即使在速度和存贮空间方面有所损失,也要尽可能地提供最好的程序环境。

3.ZETALISP语言

ZETALISP语言在LISP机上实现。它和MACLISP关系密切,有很好的兼容性,并且对MACLISP进行了很多改进,提供了新的性能。

4.QLISP语言

QLISP语言嵌在INTERLISP中,能灵活处理大型数据库,具有返回追踪与模式调用功能。

5.CommonLISP语言

CommonLISP语言是在MACLISP的基础上发展起来的,并参考了INTERLISP和ZETALISP,因而功能较强且拥有其他版本的一些优点,已被广泛使用。

6.GCLISP语言

GCLISP语言作为CommonLISP在PC上实现的第一个缩本,自然具有CommonLISP的通用性特点,其程序很容易移植到其他版本的LISP环境中。GCLISP和CommonLISP核心部分兼容,与ZETALISP的某些概念相吻合,此外还拥有若干先进的数据类型,它着眼于让机器有较强的处理能力和记忆功能,因而效率较高,用户易于掌握,使用比较广泛。 55rWBrQ0wQ39e2j4Ao/rvKHwlhzS9emDu8r/fIAD5ToVYn1gvX5kQBeDH2jDhGSb

点击中间区域
呼出菜单
上一章
目录
下一章
×