ANSI Common Lisp by Paul Graham
Publisher: Prentice Hall
There's just so much positive to say about this book. First of all it will give you much more than an introduction to Common Lisp. Sure, it is indeed an excellent introduction to Common Lisp, but it's also a guide and explanation of the philosophy behind Lisp combined with a way to think about software development that is still radically different from today's mainstream and many of the ideas transcend Common Lisp.
The writing is of an exceptionally high quality and every single sentence seems to be there for a particular reason. It's a true pleasure to read, but also very challenging; blink for a moment and you'll miss a part central to programming and Common Lisp (the only other books I can think of that gave me the same feeling are Stroustrup's The C++ Programming Language and Design Patterns by the Gang of Four).
Just as there's much care behind the writing, Paul Graham seems to have put a lot of thought into presenting code that lives up to his high standards. As he states in the preface, "programs should be beautiful" and most of the presented programs truly are; the rare exceptions are due to some rather cryptic naming of functions. Beside their beauty, the examples serve their purpose of highlighting the concepts in the text and many of them are potentially useful in the real-world too. For example, the implementation of Dylan function builders (e.g. compose, disjoin, curry) in chapter 6 not only demonstrates the power of closures; I've also found the code useful in my own programs.
After covering a lot of ground Paul Graham puts the presented concepts and ideas together in three different, larger examples: rule-based inference, a library for generating HTML (read it with care, the code in this chapter formed the basis for Viaweb - the company that later made Paul Graham a computer-millionaire), and finally an embedded, object-oriented language. Particularly the final chapter illustrates how extensible Lisp is as the language is changed to suit the problem in the style of bottom-up design and lets the reader experience the evolutionary style of programming at which is Lisp is so well suited.
As if this wasn't enough the appendixes are packed with useful information: debugging in Common Lisp, code implementing the most frequently used Common Lisp operators in Lisp itself, and a complete language reference! All this makes it a brilliant book I'll keep close by my side when hacking Lisp.
Reviewed October 2006