scheme
scheme copied to clipboard
An R7RS Scheme implemented in WebAssembly
scheme.wasm
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/
How Complete Is It?
The aim is to write a spec complete version of r7rs, although I may skip
some of the optional features.
What is done so far
- [x] Numerics
- [x] Integers (arbitrary precision)
- [x] Real numbers (double precision)
- [x] Rationals
- [x] Complex Numbers
- [x] Booleans
- [x] Strings
- [x] Characters
- [x] Pairs and Lists
- [x] Vectors
- [x] Bytevectors
- [x] Values
- [x] Records
- [x] Tail call optimization — internally
evaluses a continuation passing style, so TCO comes for free. - [x]
call/ccand exceptions - [x] Macros
- [x]
define-syntax,syntax-rules,syntax-error - [x] Hygienic over
let,let*,letrec,letrec*, andlambda - [ ]
let-syntax,letrec-syntax
- [x]
- [ ] Modules
- [ ] Ports
- [ ]
dynamic-wind - [ ] Everything else
Credits
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).