The Evolution of Lisp (1993) [pdf]

What Counts as “Lisp”?

  • Ongoing argument over whether “Lisp” is a single language, a tightly related family (Lisp 1.5 → Maclisp → CL, Emacs Lisp, etc.), or a broad family including Scheme, Clojure, Racket, Dylan, Julia.
  • Narrow view: Lisp is defined by McCarthy’s list-processor model: linked lists as core data, s-expressions for code and data, and an interpreter (eval) written in the language itself.
  • Broader view: Lisp is defined by homoiconicity, macros, code-as-data, and REPL-driven development; under this, Clojure and others clearly qualify.
  • Some argue taxonomy matters because marketing newer “Lisps” can mislead newcomers about what “Lisp” is (e.g., assuming all Lisps are purely functional or immutable).

Clojure, Racket, and Hosted Lisps

  • Dispute over whether Clojure is an “actual Lisp” or a separate “Clojure family,” due to choices like non-interned symbols, different cons/list behavior, no numeric tower, and heavy JVM integration.
  • Counterpoint: Clojure’s creator calls it a Lisp dialect; many see it as a legitimate, modern Lisp with pragmatic trade-offs (persistent data, hosted design).
  • Hosted nature (JVM, JS, .NET, Dart) is praised for leveraging existing ecosystems and enabling powerful cross-platform patterns, but criticized when core list operations aren’t uniform across variants.

REPLs, Condition Systems, and Interactivity

  • Some insist “real Lisp power” includes modifying running programs, restartable errors, and rich debugger/REPL integration—features strongly associated with Common Lisp and historical Lisp machines.
  • Others note Clojure has a powerful REPL and that full continuation/restart systems haven’t been a high-priority demand there; libraries can approximate CL-style condition systems.

Tooling and IDE Experience

  • One view: to “get” Lisp you need Emacs + SLIME/SLY-style workflow; without that, it’s just a funny syntax.
  • Others argue Emacs is not required; Racket, LispWorks, and other environments offer friendlier or more modern experiences, though cost and limitations are concerns.

Readability and Syntax Debates

  • Some call Lisp “non-readable”; others argue its uniform, minimal syntax is among the most readable once you’re used to it.
  • Advocates stress structural editing and live REPL evaluation as key to making Lisp code understandable; critics emphasize initial difficulty distinguishing special forms and control flow.
  • General sentiment: every major language has its own readability traps; Lisp’s are mostly about unfamiliarity and parentheses.

Practical Value and “Aha” Moments

  • Several say you won’t get a “Lisp Aha!” from algorithm snippets; the difference is in workflow: rapid, incremental, REPL-driven development and easy refactoring into many small functions.
  • Skeptics note that many canonical Lisp demos (macros, tiny DBs, language extensions) feel less compelling when comparable tools/libraries already exist in mainstream languages.
  • Proponents point to large real-world systems and long-lived projects in various Lisps as evidence that readability/maintainability are not inherently worse.

Learning Resources and Variants

  • Recommended resources include Common Lisp and Scheme textbooks, Racket’s documentation, Emacs Lisp manuals, PAIP, and various “build your own Lisp” or compiler projects.
  • Some praise Racket, Janet, Fennel, Emacs Lisp, and ClojureScript koans for beginner-friendly docs; others highlight Emacs itself as both a Lisp implementation and a rich learning environment.