01 — messages, not operators
No syntax to speak of — just objects sending unary, binary and keyword messages.
3 + 4.
'Smalltalk' reverse.
#(1 2 3) collect: [:x | x * x].§ 02 — Eras · 1980
everything is an object; everything happens by message
Left: era context, features, and the 101 hello. Right: 3 core concepts, 3 deeper 201 lessons, the factorial specimen, and where Smalltalk-80 lives today — each column scrolls on its own.
Kay wanted computing children could wield — programs as conversations between objects, in an environment you live inside.
Purity has a price: everything-an-object overhead, an image opaque to version control, and licensing that kept it niche.
Session one is the smallest program that still counts as speaking Smalltalk-80: what every tutorial prints first, in the dialect that mattered when the language arrived (1980).
Transcript showln: 'Hello, world'.101First contact — hello world and 3 ideas that define how Smalltalk-80 reads. 201 — 3 lessons on mechanisms you meet after the factorial specimen: the sharp edges practitioners actually use.
3 fragments, each naming a habit of mind in Smalltalk-80. Read the note, then the code — together they are the 101 in one sitting.
01 — messages, not operators
No syntax to speak of — just objects sending unary, binary and keyword messages.
3 + 4.
'Smalltalk' reverse.
#(1 2 3) collect: [:x | x * x].02 — blocks
Closures before anyone called them that; iteration is a message with a block.
[:each | each * each] "a function, as an object"
#(1 2 3) collect: [:each | each * each].03 — the live image
You edit a running system and see changes instantly — the browser/inspector/debugger were born here.
1 to: 5 do: [:i |
Transcript showln: i factorial].The 201 assumes you have read the 101 and the specimen. Each lesson is one mechanism — what it is for, how it looks in code, and the trap or payoff that makes Smalltalk-80 distinctive at scale.
The running image is the program: classes, methods and data live in one address space you can inspect and change while it executes.
Object subclass: #Ship
instanceVariableNames: 'tons'
classVariableNames: '' !A caret returns from the invoking method, and ensure blocks run on the way out — the control-flow primitives behind Smalltalk’s loop idioms.
#(3 2 1) do: [:each |
each > 2 ifTrue: [^ 'big']].
"never reached"Workspace, Inspector and Transceiver — evaluate, poke at live objects, and watch messages flow — the direct ancestors of today’s IDEs.
| s |
s := Ship new tons: 24.
s inspect.
s class name.The message: no operators, no statements — only objects sending words to objects, even to build the IDE itself. The environment is written in the language it describes.
#(1 2 3 4 5)
collect: [ :each | each * each ]installbrew install gnu-smalltalk
rungst fact.st
Pharo powers research and trading systems; its real legacy is Objective-C, Ruby, and every IDE you have used.