Hofstadter on Lisp (1983)

Lisp’s reputation as a mathematically elegant, “timeless” language is revisited through a 1983 Douglas Hofstadter essay and contrasted with how and where Lisp dialects (Common Lisp, Scheme, Clojure, etc.) are actually used today—from airline pricing and quantum tooling to formal verification and data-heavy web services. Commenters explore what makes a language “Lispy” (homoiconicity, macros, REPL-driven development, composability, dynamic yet strongly typed behavior) and why Python ultimately became dominant in AI despite Lisp’s technical strengths. Along the way, they reflect on the barriers posed by Lisp’s parenthetical syntax, shifts in language design (such as how `nil` and list primitives behave), and the loss of the more technical, mathematically literate style of older magazines like Scientific American.

Modern Uses of Lisp and Dialects

  • Widely cited real-world uses: web services (including HN), airline pricing engines, payments/receipts, cybersecurity platforms, trading, CAD/3D, chip design, quantum computing, formal verification, HPC, and internal tooling at large companies.
  • Clojure is heavily used for networked and data-heavy systems (leveraging the JVM and core.async), plus data science workflows via JVM libraries and newer dataframe tooling.
  • Scheme/Racket and Guile are used for teaching, package managers/distros, and configuration. AutoLISP remains important in AutoCAD; Fennel embeds Lisp-like scripting into Lua ecosystems.

Is Clojure “Really” a Lisp?

  • Some “purists” object (e.g., lack of traditional cons cells), but most participants treat Clojure as a Lisp dialect.
  • Several argue the important property is homoiconicity (code as data), not lists per se; trees of vectors work too.

Homoiconicity, Macros, and Code-as-Data

  • A Python user asks what Lisp gives beyond higher-order functions and decorators.
  • Replies emphasize that eval in Lisp operates on structured forms, not opaque strings; you can traverse, transform, and generate code safely before evaluation.
  • Macros and direct AST manipulation are presented as a qualitatively different tool, enabling powerful domain-specific abstractions and metaprogramming.

Nil, Lists, and Semantics

  • Historical note: early Lisp treated car/cdr of NIL as errors; Common Lisp/Emacs Lisp later defined them to return NIL.
  • Debate: some find this behavior ergonomic (shorter idioms like (cdr (assoc ...))), others call it “bleeding nils/NULLs” and worry about masking bugs.
  • Scheme explicitly does not allow car/cdr of the empty list, leading to more explicit checks but arguably safer code.

Syntax and Parentheses

  • Multiple people admit they “bounce off” S-expressions and would prefer infix or indentation-based syntaxes; Dylan, sweet-expressions, and similar experiments are mentioned but seen as niche.
  • Others argue that once structural editing and indentation are embraced, parentheses become an advantage; alternative syntaxes repeatedly fail to gain traction in practice.

Hofstadter, Algol, and Writing Style

  • Strong appreciation for Hofstadter’s clear, playful exposition and for the old Scientific American era.
  • Discussion of his comparison of Lisp and Algol as “mathematically natural”: some recall Algol (and C/Pascal) as elegant structured kernels; others cite work showing Algol procedures correspond closely to lambda calculus.

Reflections on Learning and Evangelism

  • Several lament that classic Lisp advocacy focused on recursion, AI, and theory without showing concrete productivity gains on real problems, especially on early microcomputers.
  • Others counter with more practical books/courses and note that actually writing and maintaining Lisp, not just reading about it, is what makes its advantages “click.”