A computation boxed and shelved, unopened until someone asks. It has not happened yet. It may never need to.
Every parcel is a promise the machine has not kept yet, at a cost of nothing. Tap one and the computation finally lands — that sound is the word. Then ask for the same parcel again. Under CALL-BY-NEED the memo answers: computed once, remembered forever. Switch to CALL-BY-NAME — ALGOL's way, 1961 — and every ask does the whole job again, on principle. The fifteenth parcel is marked ∞. It stays wrapped. That is not a failure of the shelf. That is the shelf working.
Before it named anything in a compiler, thunk was the noise a book makes on a table — arrival with mass. English keeps a shelf of these sound-words. This one was waiting for a computation heavy enough to deserve it.
ALGOL's call-by-name rule says an argument is re-evaluated every time it is mentioned. Compiler writers bottle each argument into a tiny closure, generated behind the scenes. P. Z. Ingerman's team christens it a thunk — the joke being it had 'already been thunk of' by the compiler, past tense of think. The pun stuck harder than the language.
Chris Wadsworth's thesis adds the memo. A thunk that overwrites itself with its own answer is evaluated at most once — laziness without the recomputation tax. The distinction demonstrated above, name versus need, is this exact thesis, in parcels.
In a lazy language everything unevaluated is a thunk — every list infinite until inspected, every value a promissory note. Haskell programmers learn to read heap profiles full of them, and to fear a million tiny parcels nobody opened. Laziness, it turns out, must also be paid for.
Microsoft borrows thunk for the shims that let 16-bit and 32-bit code call each other — the universal thunk, the flat thunk, names from a plumbing catalogue. Different machinery, same soul: a small generated stub standing in for work deferred across a boundary.
redux-thunk makes the deferred function a mainstream pattern: dispatch not a value but a computation to run later. A generation of JavaScript developers types the word daily, mostly without hearing the book hit the table.
Promises, generators, lazy imports, speculative execution — modern computing is largely a warehouse of wrapped parcels, opened on demand or never. The word survives because the idea won. Most of what your machine could compute today, it politely did not.