I like trains.
Rewriting recursion as iteration
A constructive proof of an equivalence.
Test the repository
Going beyond testing the behavior of programs.
SSH without a password with Kerberos
Avoid typing your password every time you ssh.
Breakfast burritos
A recipe for a tasty snack.
Rust in 2023
What I’d like to see from Rust going forward.
Understanding Git repository state
Tips and pointers for knowing what’s going on with a Git repository.
Provide the witness
A strategy for code organization.
Assume recursion works
A way to think about writing recursive functions.
Hash map cost bounds
A technicality hidden in some asymptotic cost bounds.
The coffee shop analogy
An analogy for software engineer levels.
A language server for Standard ML.
PL idea: built for tooling
The next generation of programming languages.
PL idea: unified function call syntax
Removing the distinction between functions and methods.
If it's worth doing, it's worth doing at all
Another little idiom I like.
Limitations engender opportunity
Alternative title: ‘tradeoffs are a thing’.
Improving my writing
Trying to do better.
Communication for software engineers
Tips on communicating effectively.
Humans are generally good
An overall positive outlook on humanity.
Terms, types, and functions
Various varieties of function in programming languages.
Unoriginality is okay
An exhortation to create.
Everything in moderation, including this
A little idiom I like.
Write more, but less
A particular writing style that may not work for you, but sometimes works for me.
Define a PL: sums
Adding sums (aka ‘enums’ or ‘tagged unions’) to a small PL.
Define a PL: products
Adding product types (aka ‘structs’ or ‘tuples’) to a small PL.
Define a PL: functions
Adding pure functions to a small PL.
Define a PL: integers and booleans
The beginnings of a small, formally defined PL.
Resources for learning Japanese
Things I use to study Japanese.