kellysmith12.21
2021-2-22 11:37:43

This is just a longwinded observation: when designing a language, you can define a translation from your new language to an abstract machine/term rewriting system. The translation is often straightforward and it quickly gives you useful theorems about your language, but doesn’t let you run code from your language. On the other hand, you can define a translation from your new language into an existing programming language, then you can run code examples, but the translation is often awkward and Byzantine, and it doesn’t provide clear theoretical insights.

Alternatively, you could define a translation from your new language into Racket. The translation is straightforward because Racket can easily express a wide range of complex constructs, you can now execute programs from your language, and you get theoretical insights because of Racket’s clear, rigorously-define evaluation model. As a bonus, you can implement the translation using the delightful macro system.

Racket really hits a sweet spot between the theory and the practice of Computer Science that I think makes it really unique. That’s all.