学习 Lisp 语言的相关书籍

Posted by David Gu on May 9, 2014

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

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

Common Lisp

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

cltl2

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

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

《ANSI Common Lisp》 by Paul Graham

ansi_cl

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

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

on_lisp

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

该书已可在 Paul Graham 的主页上下载;而它的中文版也已由田春冰河等人翻译出来了。

《Practical Common Lisp》 by Peter Seibel

practical_cl

这本书已经算是近年来的新书了。中译版依然由田春冰河翻译,这也是笔者读的第一本 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

paip

这本书我还没有读完,所以不发表过多评论。但有一点我很肯定的就是,该书里面的『人工智能』是属于 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

lol

这是一本自费出版的图书。涵盖了众多 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

cloc

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

其他一些基础书籍

Scheme

《The Little Schemer》 by Daniel P. Friedman

the_little_schemer

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

《The Reasoned Schemer》 by Daniel P. Friedman

the_reasoned_schemer

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

《The Seasoned Schemer》 by Daniel P. Friedman

the_seasoned_schemer

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

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

sicp

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

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

《Lisp in Small Pieces》 by Christian Queinnec

lisp_in_small_pieces

如果你是那种对事情的工作原理究根问底的人,那么 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》。我曾在图书馆看书休息时多次翻阅,个人感觉还算不错的一本书。

clojure

Conclusion

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

祝各位学习愉快 : )