Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/keyz/the-super-tiny-interpreter
Let's explain what a closure is by writing a JavaScript interpreter in JavaScript.
https://github.com/keyz/the-super-tiny-interpreter
Last synced: 2 months ago
JSON representation
Let's explain what a closure is by writing a JavaScript interpreter in JavaScript.
- Host: GitHub
- URL: https://github.com/keyz/the-super-tiny-interpreter
- Owner: keyz
- License: mit
- Created: 2016-04-12T16:20:08.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2016-08-03T10:03:45.000Z (almost 8 years ago)
- Last Synced: 2024-04-16T21:05:09.797Z (2 months ago)
- Language: JavaScript
- Homepage: https://tonicdev.com/npm/the-super-tiny-interpreter
- Size: 38.1 KB
- Stars: 158
- Watchers: 5
- Forks: 16
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Lists
- build-your-own-x - **JavaScript**: _The Super Tiny Interpreter_
README
# The Super Tiny _Interpreter_
[![build status](https://img.shields.io/travis/keyanzhang/the-super-tiny-interpreter/master.svg?style=flat-square)](https://travis-ci.org/keyanzhang/the-super-tiny-interpreter)
[![test coverage](https://img.shields.io/coveralls/keyanzhang/the-super-tiny-interpreter/master.svg?style=flat-square)](https://coveralls.io/github/keyanzhang/the-super-tiny-interpreter?branch=master)Let's explain what a **[closure](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures)** 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````javascript
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".
```2. Variable, a.k.a. Identifier
```javascript
foo
```3. Binary Operators
```javascript
+, -, *, /, ==, ===, !=, !==, <, <=, >, >=
```4. Unary Operators
```javascript
!, -
```5. Conditional Expression, a.k.a. the ternary operator
```javascript
test ? consequent : alternate
```6. Arrow Function Expression
- Notice that we didn't implement the traditional `function` syntax. Arrow functions FTW!```javascript
(x) => x + 1(x) => {
const y = x + 100;
return y * y;
}
```7. Call Expression
```javascript
foo(1, 2, 3)
```8. 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`.```javascript
const foo = 12;const fact = (x) => x < 2 ? 1 : x * fact(x - 1);
```