One nice feature of cargo that I wasn't previously aware of: you don't need to do anything after updating your Cargo.toml.
In npm, you need to remember to `npm i` after changing package.json. It's not declarative and the state can get out of sync.
Every time I implement an interpreter with recursion, I regret it.
As soon as I want TCO, or userland control of stack limits, or resumable exceptions, I need my own stack.
This is awkward because it's an upfront design decision. Changing the stack model is a big refactoring.
Software is typically malleable. What software is the hardest to change?
For me, the obvious cases are APIs near the bottom of the stack (e.g. imagine changing a Linux syscall) or systems with a large number of users (due to Hyrum's Law).