Implementing MicroScheme in Elm
James Carlson
Posted on March 12, 2023
I'd like to report on a little weekend project, namely to implement an interpreter for a small subset of Scheme using Elm. Here is a screenshot of the command-line interface:
The code (open source, of course!) is on Github with some
documentation there also. The code base, as outlined below, is quite small. I intend to keep it that way, since the goal is educational (I am learning a lot). I'll concentrate on a few core features, e.g., a proper implementation of environments and let-bindings.
--------------------------------------------------------
File code
--------------------------------------------------------
src/MicroScheme/Eval.elm 92
src/MicroScheme/Frame.elm 64
src/MicroScheme/Parser.elm 56
src/MicroScheme/Interpreter.elm 43
src/Main.elm 41
src/MicroScheme/Environment.elm 19
src/repl.js 19
src/MicroScheme/Expr.elm 13
src/MicroScheme/Init.elm 10
-------------------------------------------------------
SUM: 357
-------------------------------------------------------
There is more detail in the docs linked above, but perhaps just a few words more. The current state of the data type for Scheme expressions is
type Expr
= Z Int
| F Float
| Str String
| Sym String
| L (List Expr)
| SF SpecialForm
type SpecialForm
= Define
| Lambda
| Display
| If
I haven't done anything yet with Display
and If
.
The module Main
is used to mediate via ports between the interpreter and the Javascript code that runs the command-line interface you saw above in the screenshot. This set-up is very small: just 43 lines of code for Main
and 19 for repl.js
.
Plans
When the project has matured sufficiently, I will publish a more fully-featured version of the code as an Elm library. I'm also planning to integrate the interpreter into Scripta.io, a web publishing platform for technical docs. Scripta offers three markup languages: MicroLaTeX, XMarkdown, and L0. The first two are cousins of their official counterparts, while L0 is an experimental effort with syntax inspired by Lisp.
Posted on March 12, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.