So kick out the let-insertion monad. It's a neat trick, and it works if state forks are not an issue. For my use case however a more plain environment + state approach seems appropriate. To collect bindings, should I use a writer? Or should the bindings go in the state. EDIT: This works a lot better. loop can now explicty run the inner forms, threading environment and state.