Calvin's Dad Explains: Every Language Is Either Lisp or C — Meme Explained
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.
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
JavaScript is Scheme in a C trench coat wearing Java’s stolen name badge.
ASM?💀
Prolog?💀
They may be referring to functional vs (other) programming here
А чо насчёт 1С? (Wat ‘bout “Odin Ass”?!)
why js text is not centred😡
HWND is not HANDLE🧐
I'm sorry but python being C is the wrongest statement I've heard in a while
Many lisp implementations are also written in C
Technically it's undefined since dependent on implementation, nothing stops to make one in Lisp.
Browser?
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.