Archives
All the articles I've archived.
LETDEP: Dependency-Ordered Binding Semantics for let Expressions
Define LETDEP precisely, resolve forward references with dependency analysis and topological sorting, and explore the lexical-scope edge cases that make it interesting.
LETSEQ: Sequential Binding Semantics for let Expressions
Define LETSEQ precisely, implement sequential binding semantics in Elm, test the interesting edge cases, and compare similar forms in Racket and Clojure.
LETPAR: Parallel Binding Semantics for let Expressions
Define LETPAR precisely, implement parallel binding semantics in Elm, test the interesting edge cases, and compare similar forms in Racket and OCaml.
Multiple-Binding let Expressions - Syntax Before Semantics
Extend a tiny Elm interpreter with multiple-binding let expressions, then explore the semantic choices that lead to parallel and sequential bindings.
LET: Adding Local Bindings to a Tiny Interpreter in Elm
Add let expressions to a tiny interpreter in Elm and explore local bindings, scope, variable shadowing, and evaluation order through examples and tests.
VAR: Adding Variables and Environments to a Tiny Interpreter in Elm
Add variable expressions and environments to a tiny interpreter in Elm, then see how variable lookup makes evaluation depend on context.
IF: Adding Conditional Expressions to a Tiny Interpreter in Elm
Add conditional expressions to a tiny Elm interpreter and see how Boolean conditions introduce control flow by selecting which branch gets evaluated.
Make it a Syntax Error
See how grammar and AST design in a tiny Elm interpreter can turn runtime type errors into syntax errors, simplify evaluation, and connect to GADTs.
ZERO: Adding Booleans and Runtime Type Errors to a Tiny Interpreter in Elm
Add the zero? predicate to a tiny Elm interpreter and see how Boolean values introduce runtime type errors, type checks, and fallible evaluation with Result.
Simplifying Whitespace with Lexeme Parsers in Elm
Learn how lexeme parsers simplify whitespace handling in elm/parser by consuming trailing whitespace and keeping parsers close to the grammar.
Why Recursive Elm Parsers Need Parser.lazy
Learn why recursive Elm parsers create cyclic definitions, how Parser.lazy breaks the cycle, and when recursive parsers do and don't need it.
DIFF: Adding Recursive Expressions to a Tiny Interpreter in Elm
Add recursive difference expressions to a tiny Elm interpreter and see how recursion shapes the grammar, AST, parser with lazy, and evaluator.
Setting Up a Reproducible Elm Interpreter Project with Nix
Set up a reproducible Elm interpreter project with a Nix flake, Elm tooling, helper commands, source and test structure, and grammar documentation.
Testing an Elm Interpreter with elm-test
Learn how to test an Elm interpreter with elm-test at the lexer, parser, and interpreter boundaries, then extract a reusable testValue helper.
CONST: The Structure of a Tiny Interpreter in Elm
Build a tiny but complete interpreter in Elm and follow a program from source text through parsing and an AST to its evaluated result.