poteto / monkers

Bytecode compiler and VM for the Monkeylang language, written in Rust

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

monkers πŸ’ + πŸ¦€

Rust

Short for monkey-rs. An implementation of monkeylang. Previously, I implemented the interpreter in TypeScript. I am re-implementing the interpreter and later compiler in Rust as a learning exercise.

Building

$ cargo build --release

# See help
$ target/release/monkers --help

# Run the REPL with bytecode compilation
$ target/release/monkers

# Run the REPL with the tree-walking interpreter
$ target/release/monkers -s interpreted

Developing

Development REPL

Start the REPL by running cargo run, then entering some Monkey:

πŸ’ >> let a = 5;
5
πŸ’ >> let b = a > 3;
true
πŸ’ >> let c = a * 99;
495
πŸ’ >> if (b) { 10 } else { 1 };
10
πŸ’ >> let d = if (c > a) { 99 } else { 100 };
99
πŸ’ >> d;
99
πŸ’ >> d * c * a;
245025

Options can also be enabled:

$ cargo run -- -d               # debug mode
$ cargo run -- -s interpreted   # eval with interpreter

Command history is saved in history.txt.

By default, monkers REPL will compile your code into bytecode, then evaluate the bytecode with its VM. You can switch to the slower tree-walking interpreter with an arg:

cargo run -- interpreted

Helpful crates

cargo-watch watches over your Cargo project's source. I use it to run my tests and cargo check whenever a file changes. It's aliased to cargo dev, which expands to:

cargo watch -x check -x test

Optionally you can append the RUST_BACKTRACE=1 flag to get backtraces.

Contributing

PRs are welcome! I am not a Rust expert, so I welcome any recommendations on more idiomatic Rust code.

About

Bytecode compiler and VM for the Monkeylang language, written in Rust

License:MIT License


Languages

Language:Rust 100.0%