Starlark in Rust
An implementation in Rust of the Starlark language
Disclaimer: This is not an officially supported Google product. This project is supported on a best-effort basis and welcome contributions.
This interpreter was made using the specification from the go version and the Python 3 documentation when things were unclear.
This interpreter does not support most of the go extensions (e.g. bitwise
operator or floating point). It optionally includes a
set type (by enabling the
as an extension which is not specified in the
official Starlark specification, but note that this
is just an insertion-order-preserving set, and does not have optimisations for nesting as can be found in the
starlark Java implemnetation's depset implementation.
It uses signed 64-bit integers.
You can depend on the
starlark crate, it is documented using docs.rs.
A command line interpreter is also provided by this project under starlark-repl, it can interpret files passed at the command line and also start a REPL (Read-Eval-Print Loop). The usage of this program is:
$ starlark-repl --help [Starlark in Rust interpretor] Usage: starlark-repl [options] [file1..filen] Options: -b, --build_file Parse the build file format instead of full Starlark. -h, --help Show the usage of this program. -r, --repl Run a REPL after files have been parsed.
This project build with Cargo. Simply
cargo test to test it,
cargo build --release to build a release version
cargo run to run the command-line interpreter.
Possible improvements and optimizations
- When an identifier is not found, we can suggest close identifier / keyword.
- Fix suggestions maybe?
- Better error spans.
- Recoverable errors (don't stop at the first error, continue parsing).
- Static rewrite of the AST before evaluation (e.g. for constant values)
- Awesome feature:
- Implement a debugging protocol server side (compatible with the Java one, see (bazelbuild/vscode-bazel#6)).