The Super Tiny Interpreter
Let's explain what a closure is by writing a JavaScript interpreter in JavaScript.
This project is still a work in progress, but feel free to poke around and check out the unit tests.
Disclaimer
The goal of this project is not to make a spec-compliant or blazing-fast interpreter. The goal, however, is to interpret a tiny subset of JavaScript features in super-easy-to-read™ code.
Supported Syntax
- Numbers, Booleans,
null
, andundefined
12 // Numeric Literaltrue // Boolean Literalnull // Null Literalundefined // Do you know that `undefined` is actually an identifier? Paul Irish calls shadowing it the "Asshole Effect".
- Variable, a.k.a. Identifier
foo
- Binary Operators
+ - * / == === != !== < <= > >=
- Unary Operators
! -
- Conditional Expression, a.k.a. the ternary operator
test ? consequent : alternate
- Arrow Function Expression
- Notice that we didn't implement the traditional
function
syntax. Arrow functions FTW!
x + 1 { const y = x + 100; return y * y;}
- Call Expression
- Variable Declaration Statement
- Notice that we only support
const
for now and there's NO mutation (assignment) in our language.- That means we can initialize stuff once and only once
- And of course
const foo
is not valid JavaScript
- If you are familiar with Scheme/OCaml, then
const LHS = RHS
behaves just like aletrec
.
const foo = 12; const fact = x < 2 ? 1 : x * ;