Scheme is a funny PL to implement. You get a basic parser/evaluator working then suddenly TCO! call/cc! and you're doing a major refactor.
Related Posts
Counter-intuitively, if you're writing a parser for a programming language, you need it to be a total function. As soon as you build IDE tooling, you need ASTs from invalid or incomplete input.
The parser should return (Ast, List<Error>) rather than Result<Ast, Error>.
Blogging about my programming language project: choosing the basic syntax!
https://www.garden-lang.org/blog/syntax.html
Bootstrapping a language can be immensely satisfying.
I've added the ability to define stub types in the Garden stdlib and suddenly I don't need to special-case Int or String! They're just normal type declarations.