scheme语言介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Scheme 语言介绍
Wolfgang Kreutzer
翻译:寒蝉退士
原文:
/~wolfgang/cosc302/Cha p2.3.html
译者声明:译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。
APL 如同钻石,有着美妙的晶体结构;它的所有部分都以一致和优美的方式关联在一起。
但是如果你尝试以任何方式扩展这种结构- 即使是增加另一个钻石- 你将得到一个丑陋的杂种。
在另一方面,LISP 如同泥球。
你可以向它增加任意数量的泥巴,它看起来还是个泥球。
[J. Moses, as quoted by Steele and Sussman (1978)].
译序:本文是介绍人工智能的一本书的一章,Lisp 的赫赫声名缘于它是人工智能专家们做符号处理的主要编程工具。
从计算机技术的角度来说,Lisp 是函数式编程语言的代表,有着“数学基础”领域中lambda 演算的理论背景。
Lisp 的修正版本Scheme 有着一定的研究价值。
目录:
历史演化和关键概念
用Scheme 编程
概述
表示和解释- 符号& 值数据类型和它们的操作
导引控制流
Lambda 表达式和环境
执行的嵌套上下文
过程- 定义、测试、调试
递归
额外特征
对风格的一些建议
总结和看法历史演化和关键概念
在人工智能的很多研究中,Lisp 家族语言是最古老的、并仍然是最广泛使用的工具。
不象Fortran 那样,在很大程度上出于经济上的动机而保持语言存活了四分之一个世纪,Lisp 在AI 社区的兴旺是因为它的某些特征的优越。
Lisp 至关重要的一个方面是试探性程序开发的概念。
符号到值的任何提交(commitment)可以延迟直到这样的决定不可
避免,即使如此它可以用很小的代价逆转(reverse)。
这允许我们快速的探索可供选择的设计并逐步增加的建造程序。
Lisp 的语法是简单的、并且它的程序自然的表示为数据结构,所以很容易写操纵其他程序的程序。
还有一些额外的因素被结合了进来,对Lisp 的持久流行做出了贡献[Hayes (1987)]: 不象Fortan 或Cobol,Lisp 持
续自由的演化。
直到最近Lisp 程序的经济上的重要性仍是非常低的,这意味着没有任何压力要冻结语言的定义为一个标准的特征集。
作为一门AI 语言,Lisp 长期用来攻击“艰深”问题,这种任务导致了很多新特征和强力工具。
Lisp 社
区总是接受一种工具建造文化,工具开发者自身典型的也是工具的使用者的事实大力促成了这种事态。
Lisp 是非常易于扩展的("增加更多泥巴") 并自愿“让机器去做”。
AI 研究总是准备扩展计算机的能力来更好的使用人类资源,这个政策经常导致工具超越了所在时代。
被同样的动机所刺激,还有对编程环境和个人工作站的非常早期的兴趣。
这种语言创新的精神已经融入成Lisp 历史的一部分。
这已经由McCarthy (1978) 和Stoyan (1980) 详细的写入编年史中。
Lisp (List Processing Language) 最初设计为Fortran 的一个扩展。
John McCarthy 那时是Dartmouth 学院的数学助理教授,他对使用计算机做符号计算(就是说,数学表达式的简化)发生了早期的兴趣, 在“Dartmouth Summer School on Artificial Intelligence”期间受Newell 和Simon 对IPL 介绍的进一步刺激,这个研讨班是1956 年McCarthy 和Shannon 和Minsky 一起组织的。
尽管那时没有任何参与者对如何最终完成人工智能有任何概念,数值计算完全不重要好象是明显的,而操纵符号表达式的能力好象是关键性的。
IPL 已经包括了表处理和递归的想法,但它在风味上仍是非常“低级的”。
Fortan,刚刚被IBM 表彰为第一个真正的“高级”编程语言,好象是在正确方向上的前进了一步。
不幸的是Fortran 的设计受满足高效数值计算需要的支配,而导致的僵化使它对于操纵McCarthy 感兴趣的各种
应用需要的高度动态的结构是一个非常薄弱的基础。
一个自包含的表处理语言好象是更好的解决方案。
此时McCarthy 也是派到欧洲Algol(Algorithmic Language)委员会的美洲
代表团成员。
在这里它提出了条件表达式的概念并依次受到其他成员想法的影响。
McCarthy 现在正视Lisp 为带有Algol式语法的一个编译语言,但是它的第一个原型Lisp I,有着非常不同的风味。
Lisp“稀少的”语法结构和解释性本质是非常偶然的发展出来的。
我们对这些事件的讨论遵循Stoyan (1980) 给出的细帐。
在1958 年晚些时候McCarthy 获得了在MIT 电子工程
系的一个助理教授职务。
与Minsky 一起,接着是一个数学助理教授,他建立了“MIT 人工智能计划”,配备了2 个程序员,1 个秘书,1 个电传打字机和6 个学生(其中有Kleinrock、Bobrow 和Slagl - [Stoyan (1980), 165])。
这个小组开始从事写Lisp 编译器的一个适度的尝试,但是Fortan 计划报告的30 “人年”使完全实现好象是一个不可完成的目标。
最初用汇编语言手工编码了一些简单的表处理函数和圆括号包围的前缀表达式(就是“(plus 2 2)” )用于测试。
这种表示法后来被称为“Cambridge Polish”。
纪念Quine (一个(麻省)剑桥哲学家) 和Lukasiewicz (表达式的“波兰表示法”前缀形式的发明者)。
尽管实验得到了合理的进展,而递
归和垃圾收集好象是小组必须最终解决的最困难的障碍,仍
然没有语言的精确定义。
在1959 年McCarthy (1960) 写了一篇论文来展示Lisp 等价于图灵机,能作为“可计算性”的可作为替代的理论。
为此他需要一个一致的表示法,可以使用符号表达式来描述Lisp 表达式和Lisp 函数二者。
这导致了“引用”和“求值”操作符,它们最初单独的用作促成一个证明的理论工具。
但是这篇论文带来了大量未预期的结果。
这个计划的程序员之一,S. Russell 用汇编语言实现了“求值”,从而在编译器计划完全开始之前,提供了测试手工编码的函数的方式。
为了以解释性方式运行这样的简单Lisp 程序,所有表达式都必须是嵌套进去,这样程序自身成为应用于某些数据的一个表达式。
幸运的是MIT 计算实验室也介入了MAC (Multi Access Computing)计划中;最早期的努力是使用电传终端进入分时系统中。
Lisp 解释器与交换式电传终端一起使用(著名的“读,求值,打印”周期)逐渐变得非常流行。
这个解释器识别的记号后来被称为“S-语言”,而第一个工作的Lisp 系统在1959 年Association for Computing Machinery [McCarthy (1959)]年度会议上提出了。
Lisp 1 有大约90 个预定义函数,第一个应用例子是做初等函数的微分的一个简单例程。
这个解释器马上被进一步精制和扩展为Lisp 1.5 [140 个函数- McCarthy (1962)],它拥有所有后来的Lisp 系统的“祖先”的荣耀。
Lisp 1.5 迅速成为对于在Boston 区域内从事语言转换和人工智能工作的人很有吸引
的工具。
当他们离开并受雇于其他地方的时候,他们经常带上一个复本,因而导致了广泛的分布。
McCarthy 自己在1962 年去了Stanford 大学。
因为他的研究转移到更加理
论性的领域,而没有被牵涉到语言的进一步开发中。
Lisp 2,Algol 式的编译版本从未出现。
这有很多原因。
首先,在解释性上下文中S 语言“稀少的”语法(Lisp = "Lots of Irritating, Spurious Parentheses")被证实是资产而不是债务。
它使分析表达式非常的容易,因此允许快速开发嫁接在Lisp 之上的子语言。
几乎所有所谓的“AI 语言”的都以这种方式实现的,很多Lisp 程序员猛烈的抵制介入语法糖衣的额外层。
Lisp 2 死亡的另一个因素是归咎于“creeping
featuritis”[Clinger (1988a), 25]。
60 年代早期在BBN(Bolt, Beranek 和Newman)成立了一个委员会定义Lisp 2 的特征。
这导致语言规定迅速增长,为了保持“每个人”都高兴而
增加新特征。
实现由于财务上的限制最终被废弃了并从未复活过。
在Edinburgh 大学开发的Pop [Burstall 等(1971),Burton 和Shadbolt (1987)],可能最接近于Lisp 2 的样子。
现代Lisp 系统的语法同最初的“S-表示法”是一致的。
McCarthy 自己总是称之为“M-表示法”[McCarthy et al. (1962)],它也用于Allen (1978)优秀的教科书中。
Allen 称“M-表示法”为规定而“S-表示法”是表示语言。
很多基于Lisp 1.5 的主要方言出现了。
所有这些都基于一
个共同祖先,但在提供的特征和工具上显示了引人注意的区别。
这些不同在传统上通过叫做“兼容函数”的包来跨越,它在另一个上下文中解释一个语言的构造。
当然,这种方式在计算上是有花费的,而对于支持严肃工作通常需要某种形式的“手工”转换。
定理证明(比如SAINT 和SIN)和代数公式操纵系统(比如MACSYMA)方面的工作,在MIT 的MAC 计划导致了MacLisp[Moon (1974)]。
这个方言特别注意了数值计算的效率,这是对很多早期Lisp 系统的常见的批评。
MacLisp 自豪于一组丰富的数据类型(数组,hunk ...),用于程序开发和调试的用户友好的环境,和一组丰富的预定义函数(大约300 个)。
它还担当了ZetaLisp 的基础,这是用于MIT (现在是Symbolics)的Lisp-机器计划[Weinreb 和Moon (1981)]的Lisp 版本。
“标准” Lisp 和它的后代“可移植”标准Lisp [Griss 和Morrison (1981)] 由Hearn 和其他人在Utah 大学设计和实现。
最初用作REDUCE,和其他公式操纵系统的基础,它现在是Hewlett Packard 工作站的Lisp 方言,它的名字有某种误导,因为它明确的不是Lisp 标准,并且也不比其他方言容易移植。
在J. McCarthy 离开MIT 到Stanford 的时候,很多他以前的研究生被其他大学和研究机构雇佣。
Bobrow 两兄弟工作于Bolt, Beranek and Newman,一个美国研究公司。
D.
Bobrow 加入了在California 的Xerox Palo Alto 研究中心(PARC)。
一段时间内在这两个机构都维持着一个联合开发的Lisp 系统(Interlisp - Teitelman (1974))。
Interlisp 也用在Stanford 大学,在这里它成长为今天能获得的最复杂的Lisp 系统(大约600 个预定义函数),带有大量的工具和被认为最用户友好的环境[Sandewall (1978), Teitelman 和Masinter (1981)]。
这个系统的一个更新版本(Interlisp-D)后来在Xerox “Lisp 机器”上(就是Dandelion, Dorado 和Dolphin),还被移植到Siemens 和IBM 设备上。
Bobrow 两兄弟的第二个,R. Bobrow,最终担任California 大学在Irvine (UCI)的教师,在这里他开发了UCI-Lisp [Meehan (1979)],这是在很多研究机构流行的方言。
在很多年中UCI-Lisp 充当Carnegie Mellon 大学的AI 程序的
主要编程工具。
自从捐赠了第一个PDP6 到MIT 的计算实验室,DEC10 行列的机器在整个世界成为AI 研究的标准设备;同样的,Lisp 被控制为一个编程工具。
这种现象可以部分的由它被设计为一个真正分时机器的事实来解释,当时多数其他厂商的设备仍是面向批处理的。
快速人/机交互被强制为支持AI 的典型编程风格。
另一个起作用的因素在于主要的AI 中心(MIT、Stanford、Carnegie Mellon、Edinburgh)使用这些机器用于他们大批的工作的事实;使得要运行他们的软件的拷
贝就必须是选用Lisp,而它又是自由发布的。
在七十年代后期和八十年代的Unix 操作系统的流行日益增长,仍然在DEC 的小型机行列上产生了大量的Lisp 实现。
PDP11 Lisp,再次基于MacLisp,在Harvard 开发出来。
当它的一些职员去California 大学Berkeley 分校的时候被拿到了美国西海岸,这里已经对Unix 有了强烈的兴趣。
FranzLisp [Foderaro (1979)]是最终出现的方言。
它是基于Unix 的并运行在VAX 和其他在大学环境流行的机器上(比如Suns, ...)。
它的持续流行很大程度归功于它的低大学使用价格。
最近在标准化上的兴趣复兴了,很大程度上受使用Lisp 作为专家系统开发工具的刺激。
很多主要计算机厂商委托设计叫做Common Lisp 的“标准” Lisp 变体[Steele (1984)]。
“最初的目标是规定足够接近MacLisp 后代家族的每个成员的Lisp,保证这些实现乐于朝向这个公共定义来发展自身。
... 委员会的一个主要的子目标是用这个COMMON LISP 写的程序可以实现直接的源码-可传送,而不用管下层硬件” [Brooks 和Gabriel (1984), p. 1]。
迄今为止这个计划好象成功了。
现在已经存在了很多实现。
但是,仍有待观察对规整Lisp 以前不受限制的“特征”增加的尝试是否最终会成功[Allen (1987)]。
仍有怀疑的余地,因为多数Lisp 程序员是高度个人主义的,在风格问题上带有强烈的信念,因为Lisp
使实现“新”特征非常容易。
已经有对Common Lisp 的大小和它的更加不可思议特征(经常包括它们来确保与过去兼容)的普遍批评。
但是,这是一个好机会,商业压力将至少导致一个公共基础,更加专门的方言或子集可以萌发于此,还有一个希望,反映在朝向ISO Lisp 标准的努力上。
新出现的方言之一是Scheme,一个词法作用域版本的MacLisp(象NIL, T, ..)。
Scheme 在MI。