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.