原文出处:http://gty.org.in/2014/05/09/learn-lisp-books.html
作者:David Guru

Lisp语言难以推广的原因有很多,而相对来说,比较高额的学习成本便是这众多原因的其中之一。对于大部分没有任何 Lisp 程序设计背景的人来说,在学习 Lisp 语言时,往往要克服大量思维习惯上的障碍。即使是众多『新』语言层出不穷的今天 Lisp 语言的一些特性依然会被误解甚至遭受莫名的刁难。这门古老的语言当真已经毫无用处了吗?我希望人们在下断言之前首先应当对 Lisp 有一个全面而准确的了解;否则,请『划清界限』,『安心』享受你所在的编程世界的一个极端(相对于C,Lisp 可被视为另一个极端)。

下面的书籍是根据我的个人学习经验与体会所列出的,不算完整,并带有一些个人色彩。另外,可能有些尴尬的是,即使你读完了所有下面这些书,依然不能宣称自己已经会写完整的 Lisp 代码。当然,其中的道理很简单:有谁能确保在读完电视机的用户手册后就能自己造出一个电视机呢?

Common Lisp

《Common Lisp the Language Second Edition》 by Guy L. Steele Jr.

该书全面而详细地定义了 Common Lisp 语言,并且相对于第一版,第二版增加了『面向对象系统』(CLOS)、『状况系统』以及『Loop宏』的内容,这同时也使它的厚度增加了一倍之多。

该书已提供LaTeX源码以及一个转译自LaTeX代码的HTML在线版本

《ANSI Common Lisp》 by Paul Graham

在 Common Lisp 的 ANSI 标准出台之后,Paul Graham 撰写的一本 Common Lisp 的基础教程。书中内容注重基础概念的讲解,并给出了一些简单的实例。 值得一提的是,本书已由JuanitoFatas等人翻译并发布在了readthedocs上了。非常感谢他们的贡献。(编者注:看云阅读版本

《On Lisp: Advanced Techniques for Common Lisp》 by Paul Graham

正如本书副标题所指示的那样,这是一本有关 Common Lisp 高级编程技术的书。该书十分精彩,甚至对于真正想写 Common Lisp 代码的人来说是不可不读的。特别是针对那些想知道 Common Lisp 到底为何与众不同的人来说,《On Lisp》 中所讲授的(尤其是)包括宏(Macro)在内的技术一定会让他们耳目一新。

该书已可在 Paul Graham 的主页上下载;而它的中文版也已由田春冰河等人翻译出来了。(编者注:看云阅读版本

《Practical Common Lisp》 by Peter Seibel

这本书已经算是近年来的新书了。中译版依然由田春冰河翻译,这也是笔者读的第一本 Common Lisp 的相关书籍。这本书名副其实,展示了 Common Lisp 在众多实用性(而非传统认识上的人工智能领域)场合下的威力。下面是我对该书的书评。

受《黑客与画家》、《如何成为一名黑客》、《人工智能:一种现代方法》的影响,知道了 Lisp 语言,随即到亚马逊上入手了这本书——当时能找到的关于 Lisp 的中文书真的并不是很多。 非常感谢译者,在看了很多 Lisp 的资料以后,你才会认知到这本书翻译的非常『扎实』。不过,其实一开始我也觉得晦涩难懂,但这其实是书本身的结构所造成的错觉——例如我一上来就被第三章给吓到了。当然,本人的起点比较低。 只要你静下心来,不急不躁地学习这门古老而纯粹的语言,你会发现这本书越读越有意思,并且非常好的体现出了 Common Lisp 的应用价值(而不仅仅是教学所用)。我的建议是,一边到网上去看看 Lisp 的文献,一边有计划的看本书,读到第十三章左右的时候,就会觉得『一切都变得很有意思』,而最后,甚至会有种『顿悟』的感觉。

值得一提的是,这本书是有HTML在线版本的。作者 Peter Seibel 的另一本著作《Coders at Work》(中译本为《编程人生:15位软件先驱访谈录》)同样也十分精彩。

《Paradigms of Artificial Intelligence Programming: Case Study in Common Lisp》 by Peter Norvig

这本书我还没有读完,所以不发表过多评论。但有一点我很肯定的就是,该书里面的『人工智能』是属于 Old School 的那种,于是本书的主旨也许用副标题来描述则会显得更为贴切。下面我摘抄一段来自朋友的对该书的书评。

PAIP turned out to be a starting point for me. Back in 2008 I had an e-mail conversation with the late Dan Weinreb. Dan wrote me a long, insightful and friendly mail about my book reviews. As I responded I wrote: “while I love PAIP, it also made me realize how little I know. So, I decided I’ll need to build a new foundation for my learning. My solution is SICP by Abelson & Sussman. I have high expectations on it.” It turned out those high expectations were widely exceeded; SICP remains my favorite programming book. PAIP comes in at a close second place and it’s a book I recommend to anyone. Just make sure you have a understanding of Lisp’s basics and you’re in for a pleasant and rewarding learning experience.

《Let Over Lambda》 by Doug Hoyte

这是一本自费出版的图书。涵盖了众多 Common Lisp 的高级编程技术(尤其是宏),其精彩程度丝毫不亚于 PG 的《On Lisp》。事实上,作者声称这本书是 《On 《On Lisp》》。

该书部分章节已有一个HTML的在线版本

《Object-Oriented Programming in Common LISP: A Programmer’s Guide to CLOS》 by Sonja E. Keene

Common Lisp 的对象系统(CLOS)是经过精心设计的。CLOS 采用了 广义函数模型 而 非消息传递机制,光是从这一点来看笔者就觉得十分『酷炫』。总的来说,CLOS具有更高的抽象性与更好的灵活性,这一点是很值得学习的。

其他一些基础书籍

Scheme

《The Little Schemer》 by Daniel P. Friedman

非常非常有趣的一本书。包括下面的两本也都出自 Friedman 的手笔。真是位有趣的教授。

《The Reasoned Schemer》 by Daniel P. Friedman

The goal of The Reasoned Schemer is to help the functional programmer think logically and the logic programmer think functionally.

其实整个 Schemer 系列的三本书都不是在教你语法,甚至根本不是在教你 Scheme。而如果你想学习递归(Recursion)思想,并深入理解高阶函数(High-Order Functions)、词法闭包(Lexical Closures)、延续性(Continuation)等等概念,那么这三本书真是不错的选择。

《Structure and Interpretation of Computer Programs》 by Harold Abelson, Gerald Sussman & Julie Sussman

大名鼎鼎的 『SICP』。这本书是我最为推崇的书之一。作为历史上 MIT 的「6.001」 课程,其必然是有它独特的价值的。这本书让我重新思考了程序设计中的众多概念与思想,可谓大开眼界。

五星推荐。并且这本书也有一个HTML的在线版本,以及从该在线版转译的PDF版本

《Lisp in Small Pieces》 by Christian Queinnec

如果你是那种对事情的工作原理究根问底的人,那么 Christian Queinnec 的 Lisp in Small Pieces(Cambridge University Press,1996年)提供了编程语言理论和使用 Lisp 实现技术的完美融合。尽管该书主要集中在 Scheme 而非 Common Lisp 上,但两者应用的是相同的原则。 —— 《实用 Common Lisp 编程》,第32章

Clojure

Clojure 是近年来的一门充满生命力的新兴 Lisp 方言,它更强调函数式特性,并以对 JVM 的支持而闻名。然而,我本人依然在继续努力学习 Common Lisp ,暂时还没有精力去研究这门方言;而另一方面,事实上,一个叫 ABCL 的 Common Lisp 实现也可以将 Common Lisp 的代码编译成 JVM 的字节码并接而交付运行。

在此,只推荐一本《Clojure Programming》。我曾在图书馆看书休息时多次翻阅,个人感觉还算不错的一本书。

Conclusion

总的来说,Lisp 的学习之路相对来说是很耗时的,甚至可以说是比较艰辛。在刚刚列出的书籍中,不少书都有在线的HTML版本甚至PDF版本(国内好像很少有这样的『作风』);学习材料都已经有了,那就看你想不想学了。想不想学是个问题,怎样学则又是个问题。

祝各位学习愉快 : )