Early LISP history (1956–1959)

Herbert Stoyan. Early Lisp History (1956–1959). In LFP ’84: Proceedings of the 1984 ACM Symposium on Lisp and Functional Programming, pp.299–310. 1984.

A study of Lisp’s evolution from first proposal to practical implementation.

It begins with McCarthy’s proposal (co-authored with Marvin Minsky, Nathaniel Rochester, and Claude Shannon, and dated 31 August 1955) for a summer research project at Dartmouth College to “study the relationship of language to intelligence”.

In a later (handwritten!) note McCarthy homed-in on the core challenges in this programme: the lack of a clear way to describe procedures to each other (what Abelson and Sussman later refer to as procedural epistemology), and the tight binding of programming systems at that time to specific machines, and hence their need to bow to engineering (rather than semantic) considerations. The language that became Lisp sought primarily to overcome these two challenges.

The journey proceeded by taking the list data structures developed by Allen Newell and Herb Simon as part of Logic Theorist and embedding them into FORTRAN (for which there was already a working compiler) – which also incidentally muddied the conceptual waters by trying to express list and list-functional concepts in a language built around numbers that barely allowed functions to be defined by the user at all. Indeed, McCarthy and others had long-running problems accepting that the list-processing functions were functions, given that their result does not depend solely on their arguments when viewed at the lowest level. This shows how pernicious a low-level implementation can be. The final resulting language, the FORTRAN List Processing Language (FLPL), shared many programming approaches function names with what became Lisp.

McCarthy went on to champion the functional approach, including the invention of conditional expressions (alongside or replacing conditional statements) and the power of the different kinds of function composition and higher-order functions. It’s important to remember that McCarthy’s driving interest remained in AI, not programming languages per se:

Already in 1956 it was clear that one had to work with symbolic expressions to reach the goal of artificial intelligence.

Which is a fascinating piece of history in itself, as a large branch of modern AI concerning machine learning and large language models has explicit rejects this view in favour of sub-symbolic AI. Which approach is “correct” in whatever sense remains to be seen.

But it remains McCarthy’s contributions to programming languages that stand out. As well as conditional expressions he can be credited with garbage collection, meta-circular interpretation, and clarifying the relationship between programming and proof:

We should mention here that McCarthy at the same time conceived the idea of logic-oriented programming, that is, the idea of using logical formulae to express goals that a program should try to establish and of using the prover as programming language interpreter.

(Although it’s important to recognise that Newell and Simon’s work, on logic as an application rather than as a general programming language, pre-dates McCarthy’s.)

(Part of the series An annotated Lisp bibliography.)