Studios
The twelve-week teaching schedule: what happens in each studio, what to prepare, and what leaves the room.
The internal collection and URL stay sessions. Set the visible singular and plural names once in src/site-config.ts and use the language your course deserves everywhere readers see it.
Getting started
Toolchain setup, and a skeleton hand-rolled lexer that recognises integer literals — the smallest thing the course can call a running compiler
Week 1 · 22 February 2027
Arithmetic expressions
Extending week 1's lexer to arithmetic, and parsing it with a small Pratt parser
Week 2 · 1 March 2027
Assignment and a symbol table
Implementing assignment statements over a single flat symbol table — variables as SNOBOL4 actually has them, not as most languages have them
Week 3 · 8 March 2027
Strings, concatenation, and a working evaluator
String literals and concatenation by juxtaposition, wiring weeks 1–4 into one evaluator that runs real toy SNOBOL-subset programs
Week 4 · 15 March 2027
The goto field
Turning Movement I's evaluator into a statement executor — the goto field, failure propagation, and a couple of predicates to branch on
Week 5 · 22 March 2027
DEFINE, call frames, and RETURN/FRETURN/NRETURN
User-defined functions on top of last week's statement executor — call frames, save/restore, and recursion that needs no special case
Week 6 · 29 March 2027
Building the backtracking search
Literal, concatenation, and alternation as pattern values, matched against a subject with an explicit backtracking stack — or OCaml's own call stack, your choice
Week 7 · 5 April 2027
The primitives, not the search
Extending last week's matcher with ANY, NOTANY, SPAN, BREAK, ARB, ARBNO, and BAL — no change to how backtracking itself works
Week 8 · 12 April 2027
Getting something back from a match
Wiring conditional and immediate assignment, @X, and the enumerate-all-matches idiom into last week's matcher
Week 9 · 19 April 2027
The exhaustiveness checker earns its keep
Widening the interpreter's value type to cover ARRAY and TABLE, and turning on the compiler warning that catches an unhandled case
Week 10 · 26 April 2027
Making CSNOBOL4 disagree with you
Attaching source positions to every value your parser produces, and building a small differential-testing harness against CSNOBOL4
Week 11 · 3 May 2027
Finishing, not adding
The last studio before the final project is due — cutting scope, proving the extension actually works, and drafting the retrospective
Week 12 · 10 May 2027