• Stars
    star
    256
  • Rank 159,219 (Top 4 %)
  • Language
    Rust
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 1 year ago

Reviews

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

Repository Details

Monkey Programming Language written in Rust.

rs-monkey-lang

CircleCI

Monkey Programming Language written in Rust.

What's Monkey?

The Monkey Programming Language

The official Monkey logo

Monkey is a programming language designed to learn interpreters.
It's came from Writing An Interpreter In Go.

Try Monkey!

with REPL

REPL Screenshot

$ git clone https://github.com/wadackel/rs-monkey-lang.git
$ make repl

with Online Playground

Playground Screenshot

Working with Wasm!! Awesome 🐶
https://wadackel.github.io/rs-monkey-lang/

Documentation

I created the document with reference to Writing An Interpreter In Go.

⚠️ Please note that there may be some mistakes.

Table of Contents

Summary

  • C-like syntax
  • variable bindings
  • integers and booleans
  • a string data structure
  • an array data structure
  • a hash data structure
  • arithmetic expressions
  • built-in functions
  • first-class and higher-order functions • closures

Syntax overview

An example of Fibonacci function.

let fibonacci = fn(x) {
  if (x == 0) {
    0;
  } else {
    if (x == 1) {
      1;
    } else {
      fibonacci(x - 1) + fibonacci(x - 2);
    }
  }
};

fibonacci(10);

If

It supports the general if. else exists, but else if does not exist.

if (true) {
  10;
} else {
  5;
}

Operators

It supports the general operations.

1 + 2 + (3 * 4) - (10 / 5);
!true;
!false;
+10;
-5;
"Hello" + " " + "World";

Return

It returns the value immediately. No further processing will be executed.

if (true) {
  return;
}
let identity = fn(x) {
  return x;
};

identity("Monkey");

Variable bindings

Variable bindings, such as those supported by many programming languages, are implemented. Variables can be defined using the let keyword.

Format:

let <identifier> = <expression>;

Example:

let x = 0;
let y = 10;
let foobar = add(5, 5);
let alias = foobar;
let identity = fn(x) { x };

Literals

Five types of literals are implemented.

Integer

Integer represents an integer value. Floating point numbers can not be handled.

Format:

[-+]?[1-9][0-9]*;

Example:

10;
1234;

Boolean

Boolean represents a general boolean types.

Format:

true | false;

Example:

true;
false;

let truthy = !false;
let falsy = !true;

String

String represents a string. Only double quotes can be used.

Format:

"<value>";

Example:

"Monkey Programming Language";
"Hello" + " " + "World";

Array

Array represents an ordered contiguous element. Each element can contain different data types.

Format:

[<expression>, <expression>, ...];

Example:

[1, 2, 3 + 3, fn(x) { x }, add(2, 2), true];
let arr = [1, true, fn(x) { x }];

arr[0];
arr[1];
arr[2](10);
arr[1 + 1](10);

Hashes

Hash expresses data associating keys with values.

Format:

{ <expression>: <expression>, <expression>: <expression>, ... };

Example:

let hash = {
  "name": "Jimmy",
  "age": 72,
  true: "a boolean",
  99: "an integer"
};

hash["name"];
hash["a" + "ge"];
hash[true];
hash[99];
hash[100 - 1];

Function

Function supports functions like those supported by other programming languages.

Format:

fn (<parameter one>, <parameter two>, ...) { <block statement> };

Example:

let add = fn(x, y) {
  return x + y;
};

add(10, 20);
let add = fn(x, y) {
  x + y;
};

add(10, 20);

If return does not exist, it returns the result of the last evaluated expression.

let addThree = fn(x) { x + 3 };
let callTwoTimes = fn(x, f) { f(f(x)) };

callTwoTimes(3, addThree);

Passing around functions, higher-order functions and closures will also work.

Built-in Functions

You can use 6 built-in functions 🚀

puts(<arg1>, <arg2>, ...): void

It outputs the specified value to stdout. In the case of Playground, it is output to console.

puts("Hello");
puts("World!");

len(<arg>): Intger

For String, it returns the number of characters. If it's Array, it returns the number of elements.

len("Monkey");
len([0, 1, 2]);

first(<arg>): any

Returns the element at the beginning of Array.

first([0, 1, 2]);

last(<arg>): any

Returns the element at the last of Array.

last([0, 1, 2]);

rest(<arg>): Array

Returns a new Array with the first element removed.

rest([0, 1, 2]);

push(<arg1>, <arg2>): Array

Returns a new Array with the element specified at the end added.

push([0, 1], 2);

Enjoy Monkey 🐵 !


License

MIT © wadackel

More Repositories

1

react-stack-grid

Pinterest like layout components for React.js
JavaScript
856
star
2

vim-dogrun

🐶 A dark Neovim / Vim colorscheme for the GUI and 256 / true-color terminals.
Rust
454
star
3

sweet-scroll

🍭 ECMAScript2015+ & TypeScript Friendly, dependency-free smooth scroll library.
TypeScript
384
star
4

react-md-spinner

Material Design spinner components for React.js.
TypeScript
194
star
5

react-drip-form

☕ HoC based React forms state manager, Support for validation and normalization.
JavaScript
65
star
6

slack-memo-vim

Simple memo manager with Vim using Slack.
Vim Script
42
star
7

jp-prefecture

Utility library dealing with prefectures and regions in Japan.
JavaScript
33
star
8

github-pr-diff-tree

🌲 This action provide a comment that displays the diff of the pull request in a tree format.
TypeScript
31
star
9

dot-wild

Use powerful dot notation (dot path + wildcard) to manipulate properties of JSON
TypeScript
29
star
10

sequential-number

An Atom package, to inputs sequential numbers across multiple cursors.
CoffeeScript
29
star
11

color-classifier

Classify the color along the reference color. using algorithm the CIEDE2000, RGB, HSV.
JavaScript
27
star
12

nvim-syntax-info

nvim-syntax-info is a plugin that displays syntax information (highlight-groups) with nvim_buf_set_virtual_text.
Vim Script
24
star
13

git-diff-archive

Archive of the diff files using node.js and git.
JavaScript
23
star
14

svg-to-jsx-with-gui

It's a tool to convert SVG to JSX on Web browser.
JavaScript
22
star
15

gin-sandbox

🐕 gin + gorm + jwt authenticate
Go
17
star
16

scs-with-reg-viz

A example repository of visual regression test using storybook-chrome-screenshot and reg-suit.
HTML
13
star
17

toy-tree

WEB+DB PRESS Vol.117「特集1 小さく始めて,大きく改善 実戦投入TypeScript」のサンプルリポジトリ
TypeScript
13
star
18

go-gitlog

Go (golang) package for providing a means to handle git-log.
Go
11
star
19

css-keyframer

Dynamic css animation keyframes Manipulation library.
JavaScript
11
star
20

git-prout

Checkout pull request locally with Golang.
Go
10
star
21

rs-td4

WebAssembly TD4 Emulator with Rust.
Rust
9
star
22

files-sync-action

📦 A customizable action that synchronizes files across multiple repositories.
TypeScript
9
star
23

htmltojsx

⚠️ [DEPRECATED] HTML to JSX converter. Forked from reactjs/react-magic. Support for SVG attributes.
JavaScript
8
star
24

cake-hash

CakePHP in Utility.Hash class like a collection manipulation. In JavaScript.
JavaScript
8
star
25

easy-css-transform-builder

Easily build CSS transform values with JavaScript.
TypeScript
8
star
26

jquery-pwd-measure

jQuery.pwdMeasure.js is jQuery plug-in that measure the strength of the password.
JavaScript
7
star
27

dotfiles

Vim Script
6
star
28

react-drip-form-material-ui

☕ Material-UI component set for react-drip-form.
JavaScript
6
star
29

react-tax-calculator

React.jsを使った消費税計算Webアプリ
JavaScript
6
star
30

lime-grid.css

Powerful Flexbox based Grid System for modern browsers.
CSS
6
star
31

redux-samples

Redux+ES6 samples
JavaScript
5
star
32

go-gitcmd

Go (golang) package providing for tiny git command wrapper.
Go
5
star
33

flamber

💥 WIP 💥 Inspiration scraping tool for Web Designer & Web Engineer.
JavaScript
5
star
34

redux-saga-sandbox

JavaScript
4
star
35

react-drip-form-components

☕ Official UI Components for react-drip-form. styling by styled-components.
JavaScript
4
star
36

blog.wadackel.me

@wadackel's blog.
Astro
4
star
37

drip-form-validator

☕ Simple and Powerful and Customizable validation library for JavaScript.
TypeScript
4
star
38

dot-wild-tiny

Use powerful dot notation (dot path + wildcard) to access properties of JSON
TypeScript
3
star
39

react-samples

JavaScript
3
star
40

sample-d3-pie-chart

JavaScript
2
star
41

jquery-image-changer

Simple jQuery plug-in that the switching of the image with the animation.
JavaScript
2
star
42

dot-finder

dot-finder is using powerful dot notation to get values in JSON object
JavaScript
2
star
43

tslint-ass-wipe-yourself

[EXPERIMENTAL RULE] A TSLint rule. annotation comment are requires assignee name.
TypeScript
2
star
44

gulp-babel-boilerplate

CSS
2
star
45

gha-docgen

📝 Generate documentation based on the Metadata of the GitHub Action.
TypeScript
1
star
46

react-selectable-sandbox

JavaScript
1
star
47

sample-jquery-tooltip

JavaScript
1
star
48

yarn-outdated-notifier-with-circleci

Example repository using yarn-outdated-notifier in CircleCI
1
star
49

react-drip-form-test-utils

Provides useful utilities for testing react-drip-form.
JavaScript
1
star
50

enzyme-sample

JavaScript
1
star
51

sample-webpack-coffee

JavaScript
1
star
52

sample-sort-colors

JavaScript
1
star
53

laravel-sandbox

PHP
1
star
54

react-drip-form-bootstrap

React Bootstrap component set for react-drip-form.
JavaScript
1
star
55

dialog-polyfill-on-ie11

HTML
1
star
56

jquery-sweet-scroll

JavaScript
1
star
57

actions-sandbox

JavaScript
1
star
58

indent2obj

Hierarchy expressed by the indent is converted into the JavaScript object.
JavaScript
1
star
59

sample-react-dnd

react-dndを使ってドラッグ&ドロップを実装するサンプル
JavaScript
1
star
60

directree

Indent text to Tree text.
CSS
1
star
61

react-lime-grid

lime-grid.css for React.js
JavaScript
1
star
62

template-obj

template strings in the javascript object.
JavaScript
1
star