《实用Common Lisp编程》
Common Lisp,缩写为 CL(不要和缩写同为CL的组合逻辑混淆),是Lisp的众多方言之一,标准由ANSI X3.226-1994定义。它是为了标准化此前众多的Lisp分支而开发的,它本身并不是一个具体的实现而是各个Lisp实现所遵循的规范。它操作的数据是动态数据类型,但也可用的类型声明来提高效率和增强安全性。对本书的赞誉Peter Seibel的 Practical Common Lis名副其实:对于那些想要学习并开始将 Common Lisp用于实际工作的人来说,这是一本极佳的入门参考书。这本书写得非常好并且读起来很有趣,至少对于那些认为学习新语言很有趣的人来说是这样的。“ Seibel在书中并未花大量时间来抽象地讨论Lip在编程语言界的地位,而是选择了正确的切入点,通过一系列复杂度递增的编程示例来引导读者。这一思路把重点放在了那些有经验的程序员们最常使用的 Common Lisp特性上,而没有纠缠于那些即便是专家也要通过查询手册才知道的 Common Lisp语言特性的角落。 Seibel这一示例驱动思路所产生的结果就是,让读者准确地感受到了 Common lisp在以最小的代价构建复杂而具革命性的软件系统过程中所爆发的强大威力。在 Common Lisp领域已经有许多釆用了更具抽象和比较性的编写思路来创作的好书,但本能够针对实际开发者讲解实现方式及相关原因的好书却是很有价值的,无论是对当前的Common Lisp用户,还是其他潜在用户来说都是这样。”— Scott e. Fahlman, Carnegie Mellon大学计算机科学研究教授“这本书要是在我当初学Lip的时候出版该多好。这并不是说当时没有其他关于 CommonLisp的好书,但它们都不像本书这样务实和与时俱进。况且我们还不要忘了 Peter讲述了一些在其他Lisp著作中被完全忽略的内容,诸如路径名、状况和再启动等主题。“如果你初学Lisp并且想要选择一个正确的切入点,那么就不要犹豫,赶快买下本书吧。旦你读过并学会了它,接下来就可以继续阅读 Graham、 Norvig、 Keene和 Steele等人的“经典著作了。”Edi weitz, Common Lisp Cookbook的维护者和CL- PPCRE正则表达式库的编写者有经验的程序员可以从示例中学到极其有用的知识,而 Seibel这本示例丰富的入门教材中用Lisp来讲解真是件令人高兴的事。尤其令人赞叹的是,这本书中包含的如此多的示例涵盖了当今程序员日常可能用到的众多问题领域,诸如Web开发和流媒体技术。Philip greenspun, Software Engineering for internet Applications的作者,MIT电子工程和计算机科学学院对本书的赞誉“这是一本涵盖了 Common Lisp广泛内容的优秀书籍,其中通过演示一些读者可以运行和打展的实际应用,阐述了 Common Lisp许多独一无二的特性。这本书不仅说明了 Common Lisp是什么,还说明了为什么每个程序员都应当熟悉Lisp。”JOhn foderaro, Franz Inc资深科学家“ Maxima项目经常得到那些想要学习 Common Lisp的潜在贡献者的垂询。我很高兴最终有本书让我可以毫无保留地推荐给他们。 Peter Seibel那简明直接的风格使读者能够快速地领略Common Lisp的威力。他包含在书中的许多示例重点关注当代的编程问题,充分说明了Iisp绝不仅仅是一门学院派编程语言。这本书是该领域的一本极受欢迎的著作。”James amundson, Maxima项目负贲人“我喜欢那些分散在书中描述“真实和有用程序的实践性章节。我们需要这样一本书来告诉世界,使用Lisp可以轻松地将字符串和数字组装成树和图。”- Christian Queinnec *tt, Universite Paris 6(Pierre et Marie Curie“学习一门编程语言最重要的一部分就是学习它正确的编程风格。这很难教授,但通过阅读这本书,你可以轻松地获取到。仅是阅读那些实践性的示例就足以让我成为能胜任各种语言的高级程序员。”-Peter Scott,Lisp程序员“它提供了这门语言的全新视角,并且后面章节里的那些例子在你作为程序员的日常工作中也是很有用的。Frankbuss,Iisp程序员和Slashdot贡献者(www.slashdot.org)“如果你对Lisp感兴趣是因为它跟 Python或Per有关系,并且想要通过实际动手而不只是观看来学习它,那么这将是一本极佳的入门书ChrisMcAvoy,ChicagoPython用户组(www.chipy.org)“终于有一本为我们写的Lip书了。如果你想要学习如何编写一个阶乘函数,那么这本书并不适合你。 Seibel的书是为专业程序员所写的,它更关注工程师和艺术家,而非科学家,并在解决易于理解的现实问题过程中优雅而精细地体现出了这门语言的威力。阅读大多数章节的感受就好像正在编写一个程序,一开始只知道很少的内容,然后越来越多,就像在搭建一个最终可以站在上面的平台那样。当 Seibel在构建一个测试框架的过程中顺势引入宏的时候,我对如此一个简单的例子就让我能真正‘领会’它们的含义而感到震惊。书中的叙事性内容极其有用,这样的技术书籍更出类拔萃。恭喜你!”Keith irwin,Lisp程序员Ⅵ对本书的赞誉大两在学习Lisp的过程中,人们不知道一个特定函数的用途时会去查询 CL Hyper Spec,但我发现如果只是阅读 Hyper Spec通常很难‘领会’其含义。当遇到这类问题时,我每次都会翻阅这本书,它是目前在教授编程方式方面最具可读性的来源,而绝不仅仅是平铺直叙。”Philip Haddad,Lip程序员“在急速发展的r行业,专业人员需要最强大的工具。这就是 Common Lisp这种最强大、最灵活和最稳定的编程语言正获得广泛关注的原因。这是一本令人期待已久的书,它将帮助你驾驭Common Lisp,以应对当今各种复杂的现实问题。”Marc Battani, CL-PDE、 CL-TYPESETTING和 mod lisp的开发者不要认为 Common Lisp只能用于数据库、单元测试框架、垃圾过滤器、I3解析器、Web编程、 Shoutcast服务器、HTML生成解释器和HTML生成编译器等领域,这些只是碰巧在这本书中被实现的几件事。”— Tobias c. Rottweiler,Lisp程序员“当我遇到 Peter时,他正在写这本书。我自问:‘为什么已经有了许多很好的入门书籍,他还要写另一本关于 Common Lisp的书?’一年以后,我看到了这本新书的初稿,也意识到我最初的想法错了。这本书不是‘另一本’书。作者更关注实践方面而非语言的技术细节。我最初是通过阅读一本入门书学习Lip的,我觉得我理解了这门语言,但也有这样的感觉:那又怎样?这就意味着我完全不知道如何使用它。相反,这本书在用最初的几章讲解了最基本的语言概念以后就转向了‘实践’章节。读者会在跟随开发这些‘实用’项目的过程中逐渐学会更多的语言知识,同时这些项目将会合并成具有相当规模的产品。读完本书,读者会感到他们已经是专业的Common Lisp程序员了,因为他们已经‘完成’了一个大项目。我认为,Lisp是唯一一门允许采用这种实践方式来介绍的语言。 Peter充分利用了这个语言特性,勾勒出对 Common Lisp的有趣介绍。”Taiichi yuasa教授,京都大学计算机科学与通信学院“本书展示了Lip的威力,不仅是在传统领域,例如仅使用短短的26行代码就开发出一个完整的单元测试框架;而且还表现在一些全新领域上,诸如解析二进制MP3文件、构建浏览歌曲集的Wb应用以及在Web上传输音频流。许多读者会很惊讶:Lip具有 Python等脚本语言的简洁性、C+的高效性,以及设计自己语言扩展时无与伦比的灵活性。”Peter Norvig,Goge公司搜索质量组负责人, Paradigms of Artificial Intelligence ProgrammingCase Studies in Common Lisp的作者译者序很荣幸,我被授权翻译 Practical common lis一书。本书是自1994年 Common Lisp语言标准化以来,国内出版的第一本 Common Lisp的中文教材。Lisp语言家族最早诞生于1959年,它是人类历史上第二个高级程序设计语言(第一个是Fortran)。那一年,人工智能(A)专家 John McCarthy发表了具有重大历史意义的第一篇LISP论文“ Recursive Functions of Symbolic Expressions and their Computation by machine, Part I”,其中介绍了一种运行在古老的IM704计算机上的列表处理语言LISP( LISt Processing,列表处理),借助它可以轻松描述当时人工智能领域用到的各种算法。从此,Lisp语言在包括A领域在內的所有主流计算机分支上,都获得了长足的发展。Lip平台不但在 IBM PC出现之前的几乎所有计算机硬件体系上均有移植,甚至在20世纪80年代还出现过专门用来运行Lisp程序的硬件Lisp机。1994年,ANSI标准化的 Common Lisp语言将之前历史上的所有现存Lisp厂商的各种语言和平台特性做了一次伟大的总结,从此语言核心不再变化,不但标准化以前的历史遗留代码只通过少量修改就可以兼容现代Lisp平台,而且标准化以后写出的所有新代码也都几乎不经任何调整就可能运行在任何一种 Common Lisp平台上,无论是带有原生或是字节码编译器的还是间接转译成C语言的,或是运行在JM上的。目前至少有13种不同的 Common Lisp语言平台可以运行在现代计算机上,其中10种还在广泛使用中,远超过它们所在的操作系统上C和其他语言编译器的数量。可以说,Lisp语言家族长达50年的发展史就是整个计算机发展史的缩影我从2003年大学三年级时开始学习 Common Lisp语言,至今已有八个年头。当时学习它的动机基本上是出于对人工智能(传统的逻辑和推理、知识表示等方向)的个人兴趣。不过随后很快就发现, Common Lisp是一门通用的编程语言,如果不考虑其历史渊源而只从语言本身的特性来观察的话,可以说它跟人工智能亳无关系。在 Practical Common Lisp一书中,作者 Peter Seibel也谈到这个问题。当今有太多的人对Lisp语言存在类似的误解,包括相当多学过早期Lisp语言的人还停留在列表(List)是Lisp语言的唯一复合数据类型的认识上。如果读者从头到尾学完了这本书,就会发现 Common Lisp是一门特性丰富的大型编程语言,不但提供了现代编程语言普遍支持的各种数据类型(包括各种数值类型、字符串、数组、结构体和哈希表在内),还支持几乎所有的编程范式(面向过程的、函数式的以及面向对象的),尤其带有一套特性丰富且思想独到的面向对象编程接口CLOS( Common Lisp Object System)和OO扩展接口MOP( Meta-ObjectProtocol)。如果要用一句话来描述 Common Lisp中的OO与C++/Java/ SmallTalk等语言的OO有ⅥII译者序何不同,那就是 Common Lisp对象系统完全不是基于消息传递的,而是基于广义函数的。有兴趣的读者应当仔细阅读本书的第16章和第17章,其中介绍了CLOS的一些入门内容。不过Lisp语言最吸引人的地方还在于其与众不同的程序运行方式。从C语言一路学过来的人往往把一门语言的语法及其标准函数库视为语言的全部,因为一旦程序写好,编译器就会将整个代码编译成一个可执行程序或者被其他可执行程序使用的库。接下来语言本身是什么就不重要了,重要的是程序员写出了什么功能,甚至连编译器本身是什么都不重要,因为它只是一个黑箱,除了简单的优化开关之外几乎无法调整其行为各种Lisp语言则采用完全不同的方式来运行Lisp程序:Lsp平台本身是一个交互式的环境,它在很大程度上就是用其本身写成的。用户的Lisp代码以编译或解释的形式加载到Lisp环境中,然后跟Lis语言或平台本身的代码直接融合在起。换句话说,每一个Lsp程序都是对Lisp语言本身的某种形式的扩展。然后通过一个启动函数,整个程序得以运行。听到这里,读者似乎看到了 Python或者Ruby的影子,但Lisp环境还有更绝的地方:几乎所有Lisp平台都允许用户将加载了用户代码的整个环境从内存中导出(dump)为一个磁盘文件。通过直接加载这个文件而不是默认的那个只含有Lisp本身的文件,可以迅速地重建导出前的Lip环境,从而达到增量开发或者哪怕是快速加载已有Lisp程序的目的。最后和其他语言很不同的一点是,Lip语言规范(至少 Common Lisp是这样的)不但包括了如何定义某个程序组成部分(指的是变量、函数和类这些东西)的能力,还定义了从Lisp环境中清除任何程序组成部分以及就地修改它们的能力,并在语义和功能上确保了这些操作不会破坏运行中的Lisp代码。这导致了Lisp语言的另一个重要应用:通过加载补丁,Lisp系统可以在运行中被任意修改,这对24×7的服务器端程序的平滑升级尤为有利。顺便说一句,Lisp也是最早引入垃圾收集(GC)机制的编程语言,Lisp环境中的任何对象,一旦失去了来自其他对象的引用,就会在某个时刻被GC系统从内存中清除掉。读者可能已经注意到了我在不停地混用Lisp和 Common Lisp两个概念。这有两层含义:首先,存在 Common Lisp之外的Lis语言,更准确地说是Lisp方言( dialect),至少包括了 EmacsLisp、 AutoLISP、 Scheme、 Racket(前身是 PLt Scheme)和 Clojure,其中最后一个是高速发展中的新兴Lisp方言;其次,所有Lisp家族的语言都有很多共性,除了上面描述中带有Lisp而非Common Lisp字样的部分以外,还有最大的也是初学者最容易看到的一点,那就是所有Lisp方言都使用前缀表达式和用小括号表示的列表,例如1+1在Lisp中将写成(+11)。很多初学者一开始都不适应前缀表达式,但我认为前缀表达式是有很多优点的:首先,它彻底消除了运算符结合性问题,令表达式亳无歧义可言;其次,它让语言处理器更加简单高效,避免了语法分析的困难。当然,一旦习惯了也就感觉没什么了。学习本书对更好地使用其他Lisp方言无疑是大有帮助的。在翻阅书店里关于 AutolisP( AutOCAD计算机辅助设计软件的扩展语言)的各种书籍时,我经常痛心疾首地发现这些图书的作者虽然精通 autocad所提供的Lisp编程接口,但写出的 AutolISP代码要么极为难看,要么缺乏效率、滥用内存。 AutoLISP在语法上跟 Common Lisp非常接近,本书的大部分内容都适用于 AutoliSP。因此我强烈推荐所有 AutolISP程序员阅读本书以加强自身的Lisp素养。同样的同题对于 Emacs Lisp( GNU Emacs文本编辑器的扩展语言)来说也是一样的。 Scheme系的Lisp方译者序IX言区别相对大一些,如果连基本的变量和函数定义都在形式上完全不同的话(当然,思想上是没什么本质区别的),我恐怕初学者从本书中学得 Scheme编程思想的机会不大,这种情况下还是推荐《计算机程序的构造和解释》、 Lisp in Small Pieces和 The little schemer等书籍比较好。本书可以作为其他 Common Lisp语言教材的学习基础。在本书的最后一章里,作者给出了很多后续的教材,在此就不一一重复了。需要特别指出的是,另一本著名的 Common Lisp教材OnLip(作者 Paul graham,也就是《黑客与画家》一书的作者)多年前已经被我和我的几位朋友共同翻译成中文版,细心的读者可以从网上轻易地找到它。OmL主要介绍 Common Lisp的宏编程,这是 Common Lisp区别于其他语言甚至其他Lisp方言的最重要特性。我相信一旦读者掌握了本书中关于去的章节以后就可以阅读OmnL中的进阶内容,从而将自身对编程语言的认识上升到一个新的高度,不过更加符合实用原则的思路还是先把本书读完。Common Lisp绝不是一门过时的编程语言,整个 Common lisp社区一直都在高速的发展之中,近几年的发展尤为迅速。在我学习 Common Lisp的这些年里,我亲眼目睹了几个 Common Lisp平台从无到有(ECL、ABCL)或者发展壮大(SBCL、 Clozure CL)的过程。经典平台( CMUCL、MCL)也得到了良好的维护并始终跟进操作系统的自然发展。随着计算机硬件的高速发展,即便相对保守的 Common Lisp商业平台也开始或即将开始支持对称多处理器(SMP),其中 Lisp Works和 Scieneer cL都以SMP支持作为主要卖点。第三方软件包长足发展,虽然尚未达到Perl社区CAN的水平,但常用的工具包一应俱全,其中不乏高质量的大型项目。近年来最新的成果Quicklisp包管理平台,更是将 Common Lisp第三方软件包的安装过程提升到了前所未有的便捷程度。免费平台越来越好,商业平台依然昂贵,开源工具蓬勃发展,所有这些都暗示着 CommonLisp语言还保持着旺盛的生命力,唯一的问题是如何让更多的国内计算机领域爱好者了解它。这就是我翻译本书的目的所在。过去8年里,我一直活跃在国内和国际 Common lisp社区的前沿。我在大学本科的最后两年学完了 Common Lisp语言语法的主要部分,读完了包括本书在内的几本最经典的Lsp书籍,并已经能够在当时最常见的 CMUCL平台( CMU Common Lisp)上编写一些简单的程序。后来在网易工作的5年里,我在工作之余从头研究了一遍Lisp语言的发展史,亲身体会了包括Lisp机在内的十几种不同的 Common Lisp平台或实现,并自费购买了价值数千美元的商业开发环境Lisp Works,拥用三种主流操作系统上的 License。在网易从事Liux系统管理工作期间,我用Common Lisp从头实现了一万行源代码规模的SNMP简单网络管理协议工具包,它可以为任何服务器端 Common Lisp程序添加通过SNMP协议进行远程监控的能力,也可以作为基于 CommonLisp的网络监控系统的基础。我还在过去3年里参与维护了 Common lisp社区两个最重要的可移植网络库之一: socket,并由于SNMP库的需要将其从原本只支持TCP扩展到了同时支持UDP其中对于 Lisp Works的UDP支持代码是完全从头写的,因为官方并不支持。2009年,我向国际Li会议的投稿被接受,并作为会议论文集的一部分出版。我是长期担任水木社区函数型编程板块的板主之一,专门负责Lsp方向的讨论和技术分享。2011年7月,我离开网易以后开始全职从事商业Lisp软件相关的开发工作。可能我还不是一个很好的译者,但作为一个经验丰富的Common Lisp程序员,我相信自己翻译这本书是合适的。X译者序计算机领域每天都在高速发展,新语言和新技术的产生速度早已超过了一般人的学习速度。对于一个计算机领域的从业人员或爱好者来说,学习通常是为了更好地应用,把所有时间都用来学习而无暇具体应用也是本末倒置。在这种情况下,有选择地学习最有用、最不易变质的知识,以及甄别各种计算机知识的重要程度和相互关系的能力就显得非常重要了。从计算机语言的发展历史来说,如果一门语言可以存活50年,那么它的内在生命力很可能保证其继续长期存活下去,一个人用这门语言写下的代码也将比其他语言的代码更有可能长久地造福后人。总之,希望这本书能将读者顺利带入Lis领域。学习一门新的语言总是要花些成本的,但我想说,和其他任何语言相比,花在理解Lisp上的时间和精力将绝对是物超所值的,即便相当多的读者可能没有机会在短期内将Lip用于他们的日常工作。之所以这样说是有原因的:C和Lisp是编程语言的两个极端,大多数人已经熟悉了C的那一端,但如果他们还熟悉另一端的话,那么迅速理解几乎所有其他的编程语言将不再是问题大影两Top Sage. com致读者亲爱的读者:Practical Common Lisp,这难道不矛盾吗?你可能和大多数程序员一样,知道一点儿Lisp:要么是来自大学里的计算机科学课程,要么是学习了足够多的Eisp以定制 Emacs。或者可能你只是因为有人正喋喋不休地谈论Lisp,而其认为这是一门历史上最伟大的语言。但是,你可能从未想过会在同一本书的书名里看到 Practical和Lisp但你确实已经在读这样一本书了,你一定还想知道更多。也许你相信学习Lisp将使你成为一名能够胜任所有语言的高级程序员。或者可能你只是想要知道那些Lisp狂热者们总是在喊些什么。或者可能你已经学了一些Lisp,但还没有足够的能力去用它编写感兴趣的软件。如果确实出现上述情形中的任何一种,那么本书就很适合你。 Common Lisp是一种ANS标准化的工业级别的Lisp方言,通过使用它,我将向你展示如何编写那些远远超越了愚蠢的学术训练或简单编辑器定制的实际的软件。并且我将说明即便在其许多特性已被其他语言所采纳以后,Lisp仍然有其独到之处。与许多Lisp书籍所不同的是,本书不会只触及一些Lip的伟大特性而让你自己思考如何使用它们。我讨论了你在编写实际程序中用到的所有语言特性,并用了多于三分之一的篇幅来开发具有一定复杂度的软件—基于统计的垃圾过滤器、用来解析二进制文件的库,以及一个带有完整在线MP3数据库和web接口的通过网络流式传输MP3的服务器。现在就翻开它,看看这门人类发明的最伟大的语言是多么的实用吧。此致Peter Seibel
用户评论