r5js

What is this?

r5js is an interpreter for the Scheme programming language that runs in the browser. It aims to support all of the R5RS specification, including advanced features (hygienic macros, first-class continuations, proper tail recursion) that tend to be overlooked in hobbyist implementations.

I wrote r5js in 2011–2012. I give it a fresh coat of paint occasionally, adopting a new technology or improving its software engineering process. As time goes on, the technical challenges of building an interpreter are less interesting to me than the practicalities of evolving a codebase over many years. Over its lifetime, the project has been implemented in three different languages (plain JavaScript, Closure-style JavaScript, now TypeScript) and used as many build systems (Make, Maven, now Bazel).

What this is not

It is rare for technical projects to draw attention to their flaws. Being able to read between the lines to understand the risks of using technology, when no one is willing to come out and tell you, is an important skill. I wish this weren't the case; documentation should be expository writing, not marketing.

In this spirit, r5js has many significant problems.