Lisp History, Culture and Best Practices

42.1 Timeline

McCarthy designs Lisp at MIT "Recursive Functions of Symbolic Expressions" paper; first implementation (IBM 704)

MacLisp, Interlisp; AI lab culture at MIT, Stanford, BBN Scheme (Sussman & Steele, the "Lambda Papers")

Lisp Machines (MIT CADR, Symbolics, LMI, Xerox, TI) *Common Lisp the Language* (Steele); 1985: Emacs Lisp (GNU Emacs) "AI winter" hurts Lisp vendors

ANSI Common Lisp standard; first ANSI-standardized object-oriented language (CLOS)

Paul Graham builds Viaweb in Lisp (later Yahoo! Store); *On Lisp* (1993), *ANSI Common Lisp*

SBCL fork (1999), Practical Common Lisp (2005), PLT Scheme → Racket (2010)

ClojureScript, Babashka, Racket CS on Chez, Fennel, Janet, Coalton, Jank

42.2 Culture and Classic Wisdom

*"Lisp is a programmable programming language."* (John Foderaro)

*"Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."* (Greenspun's tenth rule)

*"Programs must be written for people to read, and only incidentally for machines to execute."* (SICP)

Key essays and talks: Paul Graham's *Beating the Averages* and *Revenge of the Nerds*; Rich Hickey's *Simple Made Easy* and *The Value of Values*; Steele's *Growing a Language*; McCarthy's history of Lisp.

42.3 Best Practices Across Lisps

✅ Use the REPL constantly and develop interactively.

✅ Prefer pure functions and immutable data; isolate side effects.

✅ Use clear names with dialect conventions (kebab-case, predicate?/predicatep, mutate!, *special* variables in CL).

✅ Indent properly and let structural editing manage parentheses.

✅ Write functions first; reach for macros only for syntax/evaluation control that functions can't provide.

✅ Document with docstrings and test with your dialect's framework.

✅ Learn your dialect's standard library before writing utilities.

❌ Counting parentheses by hand ❌ Unhygienic macros that capture variables accidentally

❌ Deep non-tail recursion over huge inputs in dialects without TCO ❌ Mutating shared (quoted) literal data

❌ Overly clever macro DSLs that teammates can't read or debug