• Stars
    star
    155
  • Rank 240,864 (Top 5 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Let's explain what a closure is by writing a JavaScript interpreter in JavaScript.

The Super Tiny Interpreter

build status test coverage

Let's explain what a closure is by writing a JavaScript interpreter in JavaScript.

Try it here: https://tonicdev.com/npm/the-super-tiny-interpreter

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

  1. Numbers, Booleans, null, and undefined
12 // Numeric Literal
true // Boolean Literal
null // Null Literal
undefined // Do you know that `undefined` is actually an identifier? Paul Irish calls shadowing it the "Asshole Effect".
  1. Variable, a.k.a. Identifier
foo
  1. Binary Operators
+, -, *, /, ==, ===, !=, !==, <, <=, >, >=
  1. Unary Operators
!, -
  1. Conditional Expression, a.k.a. the ternary operator
test ? consequent : alternate
  1. Arrow Function Expression
  • Notice that we didn't implement the traditional function syntax. Arrow functions FTW!
(x) => x + 1

(x) => {
  const y = x + 100;
  return y * y;
}
  1. Call Expression
foo(1, 2, 3)
  1. 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 a letrec.
const foo = 12;

const fact = (x) => x < 2 ? 1 : x * fact(x - 1);