Calvin's Dad Explains: Every Language Is Either Lisp or C
Why is this Languages meme funny?
Level 1: The Costume Party
A dad tells his kid there are only two kinds of anything in the world — say, cats and dogs — and starts sorting every animal into one of the two while the kid nods along nervously. Then he points at an animal everyone knows is a dog — it barks, it fetches, it has a dog costume on — and says, "Actually, that one's a cat." Final panel: the kid lying awake at night, staring at the ceiling, unable to unhear it. The joke is that feeling when someone confidently rewires how you see a familiar thing — and the scariest part is you can't find the flaw in their argument.
Level 2: The Two Family Trees
The terms doing the heavy lifting, defined:
- Lisp — a 1958 language family (Common Lisp, Scheme, Clojure) where code is built from expressions and lists, functions are values you can pass around, and programs can manipulate their own structure.
- C — the 1972 systems language whose
{ braces }, semicolons, and explicit step-by-step mutation became the visual template for Java, C++, C#, and JavaScript. - First-class functions — functions you can store in variables and hand to other functions. In JS:
arr.map(x => x * 2). This is the most Lisp-ish thing JS does daily. - Closures — functions that remember the variables around them when created. The basis of practically every JS pattern from event handlers to React hooks.
- C-like syntax — looking like C without behaving like it. JS borrowed Java's costume in 1995 to ride Java's hype wave.
The junior-developer rite of passage embedded here: the day you realize the language you learned for "making buttons work" secretly behaves like the weird academic one with all the parentheses — and that this is why callbacks ever made sense at all.
Level 3: Scheme in a Trench Coat
The reason this lands with senior engineers is that the JS claim is historically literal. Brendan Eich was hired by Netscape in 1995 explicitly to put Scheme in the browser; management then demanded the new language "look like Java" for marketing alignment, and the famous ten days of prototyping produced a Lisp-family core wearing C-family syntax. Every weird-beautiful part of JavaScript — closures over mutable bindings, functions as values you pass to addEventListener, the entire callback-then-Promise-then-async lineage — descends from that smuggled Scheme heritage. The meme's pairings encode the standard arguments people have in code review threads: Ruby? Lisp. (Matz openly cited Lisp; blocks are lambdas, everything is an expression) versus Python? C. (Guido's resistance to functional style is legendary — lambda is deliberately crippled to one expression, reduce was exiled to functools, and statements aren't expressions).
The deeper satire is about taxonomy itself as a developer pastime. Sorting languages into two buckets is the kind of confident reductionism that sounds profound at a whiteboard and collapses under any real example — where does Rust go? Prolog? SQL? — yet we keep doing it because dichotomies are how tribes form. The strip's structure mocks this perfectly: an authority figure delivering an unfalsifiable framework to a captive audience, with the final panel showing Calvin wide-eyed and sleepless in bed — the canonical closing frame Watterson used when the dad's "explanations" (wind is caused by trees sneezing) broke his son's model of reality. Replace "trees sneezing" with "JS is a Lisp" and the psychic damage is identical, except this time the dad is arguably right, which is worse.
Level 4: Lambda Calculus vs. the von Neumann Machine
The dad's taxonomy — "The two types of programming languages are Lisp and C" — is a child's bedtime version of a genuine theoretical divide. In 1936, two equivalent models of computation appeared: Church's lambda calculus (computation as function application and substitution) and Turing's machine (computation as state mutation on a tape). Lisp, born in McCarthy's 1958-1960 work, is lambda calculus with parentheses: programs are expressions, evaluation is reduction, code is data (homoiconicity), and lambda is right there in the language. C, by contrast, is the von Neumann architecture with portable syntax: programs are sequences of instructions mutating memory cells, and every construct maps within shouting distance of the hardware. Backus's 1977 Turing Award lecture famously asked whether we could be "liberated from the von Neumann style" — that lecture is essentially this comic strip with proofs.
The classification game the dad plays is therefore a question about semantic core, not syntax. Haskell? Lisp. — typed lambda calculus (System F with extensions), where evaluation is reduction. Java? C. — statements, mutation, an abstract von Neumann machine with garbage collection bolted on. The punchline panel — "Despite having C-like syntax, JS is a Lisp." — is the strip's thesis: surface grammar is a costume; the evaluation model is the soul. JavaScript has closures capturing lexical environments, first-class functions, dynamic typing, and (post-ES6) proper tail-position semantics on paper — the Scheme genome expressed through curly-brace phenotype.
Description
A four-panel meme built from an edited 1990 Calvin and Hobbes strip (© Universal Press Syndicate). Panel 1: Calvin's dad walks toward Calvin, who sits by a record player, saying 'PLAYING with types? I'LL SHOW YOU SOMETHING INTERESTING.' Panel 2: the dad, spinning a record, declares 'The two types of programming languages are Lisp and C. All languages fall into these two categories.' with overlaid logo pairings: Haskell? Lisp. Java? C. Calvin replies 'YEAH...'. Panel 3: more pairings with logos - Ruby? Lisp. Python? C. - and the dad concludes 'Despite having C-like syntax, JS is a Lisp.' Panel 4: Calvin lies wide-eyed and traumatized in bed, the classic existential-dread closing frame. The meme plays on the real lineage argument that JavaScript was originally conceived as Scheme-in-the-browser (closures, first-class functions, dynamic typing) despite wearing Java/C syntax for marketing reasons
Comments
25Comment deleted
JavaScript is a Lisp wearing C's clothes to get past Netscape marketing - and like all great disguises, we only noticed after it shipped to every device on Earth
ASM?💀 Comment deleted
C Comment deleted
Prolog?💀 Comment deleted
Lisp Comment deleted
Piet?😢 Comment deleted
C Comment deleted
Whyyyy Comment deleted
you can pretty much call it visual asm Comment deleted
They may be referring to functional vs (other) programming here Comment deleted
А чо насчёт 1С? (Wat ‘bout “Odin Ass”?!) Comment deleted
It's kinda derivative of Java so C Comment deleted
why js text is not centred😡 Comment deleted
because cSs is awes ome Comment deleted
HWND is not HANDLE🧐 Comment deleted
I like your funny magic words Comment deleted
I'm sorry but python being C is the wrongest statement I've heard in a while Comment deleted
Many lisp implementations are also written in C Comment deleted
Technically it's undefined since dependent on implementation, nothing stops to make one in Lisp. Comment deleted
aye. there's plenty of python implementations, CPython is just the reference implementation. Comment deleted
You are the reason why this emoji has widespread use -> 🤓 Comment deleted
You are the reason why software goes to shit: you still haven't learned to understand what you're reading. Comment deleted
Browser? Comment deleted
I think files, as browsers' primary purpose is to render files Comment deleted
I think graphics could honestly go either way. Depends a lot on exactly what you're doing. Your 2D games are obviously files, but if you're working on full path tracing, that's obviously math. Comment deleted