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/cdrare 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.
- More descriptive aliases (
- 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
consactually 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 forcons) and how they might align better with beginner intuition.