A dialect of the Monkey programming language written in Rust, has both interpreted and compiled implementation
Monkey has a C-like syntax, supports variable bindings, prefix and infix operators, has first-class and higher-order functions, can handle closures with ease and has integers, booleans, arrays and hashes built-in. Reading through Writing An Interpreter In Go and Writing A Compiler In Go for more details
Archives of precompiled binaries for caescript are available for Windows, macOS and Linux
- Build release
$ make install_eval - Build release using the Compiler implementation
$ make install - Running the REPL
$ caescript- Running the Interpreter/Compiler
$ caescript [vm/eval] examples/hello.cae- Integers, booleans, strings, arrays, hash maps
- Arithmetic expressions
- Let statements
- First-class and higher-order functions
- Built-in functions
- Recursion
- Closures
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); It supports the general if. else exists, but else if does not exist.
if (true) { 10; } else { 5; } It supports break/continue in for loop block
let sum = 0; let i = 5; for (i>0) { if (i == 4) { break; } sum += i; i -= 1; } sum // 5 It supports the general operations.
1 + 2 + (3 * 4) - (10 / 5); 1.0 + 2.1; !true; !false; +10; -5; 1 % 2; true && false; "Hello" + " " + "World"; a += 1; It returns the value immediately. No further processing will be executed.
if (true) { return; } let identity = fn(x) { return x; }; identity("Monkey"); 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 }; Five types of literals are implemented.
Integer represents an integer value.
Format:
[-]?[1-9][0-9]*; Example:
10; 1234; Float represents a float value.
Format:
[-]?[1-9][0-9]*\.[1-9][0-9]*; Example:
1.0; 12.34; Boolean represents a general boolean types.
Format:
true | false; Example:
true; false; let truthy = !false; let falsy = !true; String represents a string. Only double quotes can be used.
Format:
"<value>"; Example:
"Monkey Programming Language"; "Hello" + " " + "World"; 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); Hash expresses data associating keys with values.
Format:
{ <expression>: <expression>, <expression>: <expression>, ... }; Example:
let hash = { "name": "cae", "age": 24, true: "a boolean", 99: "an integer" }; hash["name"]; hash["a" + "ge"]; hash[true]; hash[99]; hash[100 - 1]; Function supports functions like those supported by other programming languages. Support both anonymous and named functions.
Format:
fn (<parameter one>, <parameter two>, ...) { <block statement> }; fn name(<parameter one>, <parameter two>, ...) { <block statement> }; Example:
let add = fn(x, y) { return x + y; }; add(10, 20); fn add(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.
It outputs the specified value to stdout. In the case of Playground, it is output to console.
puts("Hello"); puts("World!"); For String, it returns the number of characters. If it's Array, it returns the number of elements.
len("caescript"); len([0, 1, 2]); Returns the element at the beginning of Array.
first([0, 1, 2]); Returns the element at the last of Array.
last([0, 1, 2]); Returns a new Array with the first element removed.
rest([0, 1, 2]); Returns a new Array with the element specified at the end added.
push([0, 1], 2); Caescript is under MIT