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.
$ 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 interpretedStart 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
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.
PRs are welcome! I am not a Rust expert, so I welcome any recommendations on more idiomatic Rust code.