List processing

List processing

J.M. Foster. List Processing. Macdonald and Co. 1967.

A slim volume discussing list processing with reference to Lisp and to other list processing systems of the time (including some libraries embedded into Fortran).

The most fascinating part of the book is its bibliography, which references a lot of papers that have disappeared from the collective memory of computer science, but whose implications were profound.

Recursive functions of symbolic expressions and their computation by machine, Part I

Recursive functions of symbolic expressions and their computation by machine, Part I

John McCarthy. Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I. Communications of the ACM 3, pp.184–195. 1960.

The original Lisp paper from 1960, which opens:

A programming system called LISP (for LISt Processor) has been developed for the IBM 704 computer…

The paper then proceeds to lay out everything that’s since been built on: the basic constructs, the use of cons cells (pairs) as a data representation, the world’s first garbage collection algorithm, an equational semantics, and ideas for interpretation and compilation. It’s awesome, and humbling to read it and realise its age and the vision of computing it developed.

(Despite this paper being labelled Part I, incidentally, there isn’t a part II.)

Paradigms of artificial intelligence programming: Case studies in Common Lisp

Paradigms of artificial intelligence programming: Case studies in Common Lisp

nil

Peter Norvig. Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp. Morgan Kaufmann. 1992.

An absolute classic of both AI and Lisp, and really two books in one. The applications presented cover the entire range of “classic” AI up to the late 90s: expert systems, logic programming, symbolic mathematics, knowledge representation, constraint programming, game search, syntax-driven natural language processing, and more.

It uses Lisp as the programming vehicle, and doesn’t shy-away from depth, dealing with the effects of garbage collection (and how to program effectively in its presence), the effects of different representations, low-level optimisation and disassembly, and all the approaches one needs to use Lisp in real, scalable practice.

Common Lisp recipes: A problem-solution approach

Common Lisp recipes: A problem-solution approach

nil

Edmund Weitz. Common Lisp Recipes: A Problem-Solution Approach. Apress. 2016.

An extensive list of recipes for using common data structures, how the differ in Lisp from the equivalents in other languages, and what novel features Lisp has to offer. A great place to start when moving away from being a beginner, and for dipping into in search of solutions.

It’s probably strongest on the “gotchas” and dangers that Lisp presents, but also has a lot to say about coding style and code optimisation.

The Common Lisp condition system

The Common Lisp condition system

nil

Michał “phoe” Herda. The Common Lisp Condition System. Apress. 2020.

An enormously detailed look at the condition system, sometimes regarded as the Lisp equivalent of exception-handling in other languages.

But that’s massively unfair to the condition system, which is really a way to deal with non-local transfers of control in the most flexible way possible. Exceptions are just one type of this, and the condition system aims to separate three aspects that are often combined in other languages: detecting and signalling a condition, responding to a condition, and deciding on the binding between the two, possibly combining responses differently in different contexts. It’s a set of concepts that are in many ways foreign to a lot of other languages, and so justify the detail for those occasions when these techniques are appropriate: deciding when they are appropriate is non-trivial, a matter of both functionality and style.