GitXplorerGitXplorer
k

the-super-tiny-interpreter

public
173 stars
14 forks
0 issues

Commits

List of commits on branch master.
Unverified
e07804d1f5e855b778eeb4a935d1eb424c317d7a

updated README

committed 8 years ago
Unverified
08e888b5f4d0fb69d7fa653045f920733678b3b9

1.0.3

committed 8 years ago
Unverified
14072242dae2794e11fab13d99dcae8ea9554cd6

added tonic example

committed 8 years ago
Unverified
ac72908c860c3929b3188a6aa5b7f27c5984b139

bumped deps and fixed lint issues

committed 8 years ago
Unverified
3fc9aa97a4abefecfd4e7ab6a147dcff500d6975

1.0.2

committed 9 years ago
Unverified
e817858fc01862708f0380781c0a1be63f567d85

added babel-polyfill

committed 9 years ago

README

The README file for this repository.

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);