An R7RS Scheme implemented in WebAssembly
A partial implementation of r7rs scheme, written
entirely in WebAssembly using the WebAssembly Text format. The only external
imports are for IO (read
, write
, and readFile
), unicode (I have an
import that reads information about 256 code-point blocks to enable case
operations etc.), and process control (exit
).
You can try it out at pollrobots.com/scheme/
The aim is to write a spec complete version of r7rs
, although I may skip
some of the optional features.
- Numerics
- Integers (arbitrary precision)
- Real numbers (double precision)
- Rationals
- Complex Numbers
- Booleans
- Strings
- Characters
- Pairs and Lists
- Vectors
- Bytevectors
- Values
- Records
- Tail call optimization — internally
eval
uses a continuation passing style, so TCO comes for free. -
call/cc
and exceptions - Macros
-
define-syntax
,syntax-rules
,syntax-error
- Hygienic over
let
,let*
,letrec
,letrec*
, andlambda
-
let-syntax
,letrec-syntax
-
- Modules
- Ports
-
dynamic-wind
- Everything else
Where practical everything has been implemented from scratch, but there are places where it either wasn't practical, or where I tried and failed to implement them myself, so credit is due to:
- xxHash: It's probably overkill, but the hashing algorithm used for hashtables, which are in turn used for environments and interning symbols, is xxHash translated from the C++ implementation at github.com/Cyan4973/xxHash
- string->real: Strings are converted to real numbers using Algorithm M from "How to Read Floating Point Numbers Accurately", William D Clinger 1990. Which is conveniently expressed in scheme in the original paper
- real->string: Real numbers are converted to strings using Grisu 2 by Florian Loitsch. This was translated from C++ found at github.com/romange/Grisu
Additionally inspiration came from a couple of places
- Lispy: Peter Norvig's article (How to Write a (Lisp) Interpreter (in Python)) was a critical source of inspiration.
- EPLAiP: Nearly a decade ago a friend gave me a copy of Exploring Programming Language Architecture in Perl by Bill Hails. Definitely worth reading regardless of your language of choice (I haven't written PERL this millenium).