Why does Lisp use cons cells? (1998)

Tone, style, and online culture

  • Many describe the original post as technically excellent but dripping with hostility; some find this entertaining or refreshing, others find it exhausting and counterproductive.
  • There’s a broader debate about blunt rudeness vs. passive-aggressive hostility vs. simple civility.
  • Several recall traumatic experiences on Usenet as newcomers, contrasting that with today’s more moderated environments and specifically praising HN’s moderation approach.
  • Others argue that it’s possible—and desirable—to mentally strip tone and focus only on content, but not everyone finds that realistic.

Impact on Lisp community and Usenet

  • One view: a particularly abrasive Usenet personality effectively poisoned the main Lisp newsgroup, driving away newcomers and scaring off prominent practitioners, which hurt Lisp’s evolution and visibility.
  • Counter‑view: the newsgroup was only a small, self‑selected slice of the actual Lisp community; most serious work happened in mailing lists, universities, companies, and never touched Usenet. Lisp’s decline is attributed more to broader industry trends than to newsgroup flamewars.
  • There’s agreement that trolls and flame dynamics made comp.lang.lisp unpleasant and that handling this kind of behavior remains a hard problem for online communities.

Why cons cells & their properties

  • Cons cells (pairs) are praised as extremely simple, expressive primitives: from address pairs plus symbols, one can build lists, trees, records/structs, arrays, and even arbitrary graphs.
  • They’re seen as “low-level” in a mathematical sense: a tiny set of abstractions that make code and data easy to represent and transform.
  • Persistent data structures and structural sharing (e.g., cheap prepend, copying with shared tails) are highlighted as key advantages.

Performance and data-structure tradeoffs

  • A long subthread debates performance:
    • Critics note that pointer‑chasing in linked lists hurts locality; vectors often win for traversal and random access, especially on modern cached architectures.
    • Defenders reply that many managed runtimes (not just Lisps) already rely heavily on heaps of pointer‑connected objects; locality is mitigated by allocation strategies and garbage collectors that compact or cluster objects.
    • Benchmarks in the discussion show lists can be only slightly slower than vectors for some operations; lists also shine for patterns like repeated prepending or simple stacks.
  • Both sides agree there are tradeoffs and that vectors are often, but not always, the better default; they disagree on how severe and how Lisp‑specific the list penalties are.

Naming (car/cdr) and accessibility

  • Some argue that archaic names like car/cdr are a needless barrier for beginners and defended mostly through nostalgia or hardware history that no longer matters.
  • Others respond that:
    • More descriptive aliases (first/rest) already exist and can be used.
    • Once learned, the names are just standard jargon, a very minor blemish compared to the language’s benefits.
  • There’s criticism of attempts to portray these names as deep virtues rather than mild warts.

Learning cons and list intuitions

  • Several comments walk through how cons actually constructs lists, including why expressions like (cons (list 1 2) (list 3 4)) logically yield a three‑element list.
  • One theme: understanding lists as chains of cons cells (rather than magical “list” objects) makes results like this intuitive.
  • There’s mention of alternative primitives (list*, different arities for cons) and how they might align better with beginner intuition.