Common Lisp
版权声明:本书的著作权属于原作者,本人的英文原版书籍来自网络,本书的中文译本任何人可以自由转载,但请务必标明出处,不得做出任何更改,如果有任何错误或是疑问的话请发送电子邮件至wcwwdw@163.com或者wcwwdwster@gmail.com 欢迎提出宝贵意见,本人保留中文版的署名权。擅自将本文章用于任何商业目的,将承担法律责任。
原书作者:Guy L.Steele Jr.(Lexington, Massachusetts)
中文翻译:刘兴华(郑州大学)
前言
第二版
Common Lisp语言是成功的。自从1984年本书第一版发行以来,许多程序员已经把它当成一种实现Lisp程序的事实上的标准。也正因为如此,现在大型的Lisp程序有众多的程序模块去方便的利用。Common Lisp已经被证明是一个实用、稳定的适用于处理快速原型法和系统传递等人工智能及相关领域问题的平台。我多年来使用Common Lisp于众多的应用软件和具体实现尚没有机会去发现Common Lisp的不足,并去创新一把。Lisp语言的一个重要特性就是它对语言扩展有良好的支持。而Common Lisp除了稳定外,这些功能没有丝毫的削弱。
1984版的Common Lisp定义不够完善和全面。从某种程度上来说这是无意地,一些边界情况被忽略了、一些重要特性没有说明、甚或有一些章节说明互相抵触还有一些大家熟知的特性及传统的依赖关系我忘了写出来。从另外的角度来讲这个不拘的Common Lisp标准委员会对Common Lisp的定义也不能拘泥于某种特定解决方案,并因此认同与其选择一个“弱化功能”的定义,倒不如留下那些重要的特性的定义给用户自己发挥。一个典型的例子就是错误处理:1984版Common Lisp有大量的方法去发现一个错误,但却没有一种方式去捕获和处理它们。
之后的1985年我收集了大量的关于第一版的错误和Lisp语言的缺点。12月份,一群开发者和用户在波士顿聚会来共同讨论Common Lisp的体系。我为这次会议准备了两张表,一份是勘误表及不会产生争议的澄清(哥们,我棒吗?)还有另一份我认为确实需要改进的也许应投票表决的改进表。其他与会者也带来了他们的提议参与讨论。毫无疑问,这儿的每个人都对Common Lisp有足够的兴趣,并信任它的稳定性,我们需要一个更加正规的机构来负责改进这门语言。
这便产生了一个隶属于ANSI的附属委员会X3的X3J13小组,一个专门负责Common Lisp的美国国家标准的小组。X3J13小组已经完成了大部分的对1984标准的技术修订和增补,来完善这个已经被广泛应用和承认的标准。一个草拟的标准已经完成,并且有望于1990年公布。接着会是一个公示期(ANSI的要求)。X3J13小组必须处理来自各方的意见和反馈,如果确实有必要根据各方意见对草案做出改动,那么公示期就会更长,直到它达到可以被接受为美国国家标准的那一天。
可喜的是,X3J13小组的活干的相当不错。对每项通过投票表决通过的更改,都会有专门的文档来描述其所解决的问题及其它的可能的解决方法。对每种解决方案都有详细的关于语言变化的建议、原理及不同的建议之间的细微差别和测试方法。对于当前的惯常用法,做了开发者、用户的成本分析,不采用改进建议可能造成的成本负担,及采用后得到的好处和美学效果。在正式的方案前有着相关的非正式的方案的种种讨论。而所有的这一切除了最终结版发行外,也将有其在线版本。据我所知,截至1989年6月份多达186份此类的建议已经核准通过(当然不包括那些更多的被委员会小组拒绝的建议)。
本人写作此书第二版的目的就是让人们更好的从第一版过渡到即将面世的ANSI标准的Common Lisp。由于必须的公示期,距ANSI标准最终版的公布尚需待以时日。本书不是即将公布的标准(其由Digital Equipment Corporation的Kathy Chapman在X3J13草案附属委员会的协助下独立制定)的翻版。
通过在X3J13投票表决,我在第二版中融入了大量的可用素材,为的是向读者呈现一幅清晰的Lisp语言的发展趋势图。我的目的绝非简单的一字一句的引用X3J13说明文档,而是力图在第一版的框架体系内来叙述和阐释X3J13的内涵。一次单独的关于X3J13的投票也许会在本书的多个地方提及,而一个本书的独立的篇章也许涵盖了多次投票的结果。
我的想法很明白,虽然本书以X3J13标准素材为依据,但绝非X3J13标准的官方说明文档。我也不会试图去给即将公布的ANSI标准做出一个权威的解释。委员会的解释具有更显著的稳定性(它仅仅有过几次废弃较早解释的“前科”),我也更倾向于坚持目前的发展方向不动摇。然而,草案标准也有可能在主流要求和公众意见下做实质性的修订。我在此讲述X3J13的行为不是要记下他们“篡改”了Lisp,我只是想让人们了解Lisp自第一版以来的变化的趋势。我努力注意自己不要简单的说“这种语言变了”或者“X3J13就是如此这般的做出了如此的修订”。
在正式的ANSI版Common Lisp公布前,1984版定义还将在大范围内应用。本书在写作的过程中同时吸收了1984年的定义及X3J13对Lisp的改进。
本书包涵了对《Common Lisp: The Language》第一版勘误和小幅度的文笔调整后的全部内容。但是本书超过一半的内容是全新的。所有的新内容都会在左边的空白处加上实线(译者注:本书为了醒目,我使用了红色实线)。而原第一版的属于1984版的定义但X3J13已经对其进行了修改的内容将在左边标出点化线。对这些过时的信息的修改将会在上下文中给出解释(这也将用实线在左边空白处标出)总之:
如果没有在空白处标注实线,那么就是用的1984年的语言定义。
如果是更新的语言定义,那么一定要注意空白处的点化线。
在本书的最后将是X3J13的的投票列表,它安照委员会内部代号名排序(包括了对X3J13的交叉引用,对于公示期将非常有用)。引用这个表中的投票结果将以尖括号中的数字来表示,如<14>表示引用了关于14号问题的表决结果,但是[14]则表示对于参考书目14的引用。
我努力想使第一版使用的措辞在本书中的改动做到最小。显然拼写和印刷错误已经得到了改正,当然这是采用统一的拼写和标点格式达到的效果。(注意:特殊的是本书第一版使用“signalling”来表示“发信号”,但是X3J13标准中被写作“signaling”。)(译者注:其实这些对汉语没什么影响,但为了尊重原版故而翻译出来-----下同)为了符合排版需要和既定格式又作了一些细微的改动。(譬如,为了使文章看起来有美感和为了使第二页结尾有更好的换页符,第一章的第一句的“also”被删除了。)只有相当少的情况下我悄悄的更正了一些第一版确实存在的错误,但这些段落的开始部分会有一个“更正注意”(Notice of correction)的标记。
本版的章节标号与第一版相同,惟一的例外就是插入了7.9节。四个新的章(26-29)增述了那些被核实的X3J13加入的特性:一个增加的循环宏(loop macro),一个优秀的打印接口(printer interface),Common Lisp面向对象系统(Object System)和Common Lisp条件系统(Condition System)。
X3J13,在它工作的同时,设立了一个附属委员会来研究是否有必要把迭代(iteration)加入到Common Lisp标准中去,由于难以达成广泛的共识,所以这一特性并未包含在第一版中,X3J13的附属迭代委员会发布了实现迭代的三个可行方案,其中的循环(Loop)特性已经核准增补进即将发布的草案标准中,本书的第26章将对其进行说明。X3J13也表示出对另外两个特性的兴趣(数组(series)和生成器(generators)),但是在1989年1月的讨论中,普遍认为这两个特性尚不够成熟且目前的应用也不是很多,现在还不是将其加入草案的时机。不过,附属委员会还是被要求来完善它们,X3J13标准也许在不久的将来会接纳它们。请注意我并未臆测这两个提议是否会被X3J13标准化。不过我还是把它们包括在了第二版之中,通过与Dr.Richard C.Waters先生的合作,我把它们加入了附录A和B中,希望它们可以对Lisp社区有用。据我个人的判断,这些建议涵盖了Common Lisp未能涉及的部分,无论是否被接纳为正式的标准,它们都有其实用价值。
一些书中的新材料与X3J13毫无瓜葛,在书中的许多地方,我增加了解释,澄清,举例,警告和书写短小代码的技巧。附录C中包含了一篇代码,它能帮助你更好的理解后面引用(backquote)的语法构造。
与第一版不同的是,第二版中包含了一些图表来给大家提神,但是书中连笑话也一个没多,只是多了少许的大白话。