An embeddable dynamic programming language for Rust.
Visit the site ๐ — Read the book ๐
rune
The Rune Language, an embeddable dynamic programming language for Rust.
Contributing
If you want to help out, please have a look at [Open Issues].
Highlights of Rune
- Run simple [Scripts ๐][support-scripts].
- Runs a compact representation of the language on top of an efficient
- Clean [Rust integration ๐ป][support-rust-integration].
- [Multithreaded ๐][support-multithreading] execution.
- [Hot reloading ๐][support-hot-reloading].
- Memory safe through [reference counting ๐][support-reference-counted].
- [Awesome macros ๐][support-macros] and [Template literals ๐][support-templates].
- [Try operators ๐][support-try] and [Pattern matching ๐][support-patterns].
- [Structs and enums ๐][support-structs] with associated data and
- Dynamic containers like [vectors ๐][support-dynamic-vectors], [objects
- First-class [async support ๐][support-async] with [Generators ๐][support-generators].
- Dynamic [instance functions ๐][support-instance-functions].
- [Stack isolation ๐][support-stack-isolation] between function calls.
Rune scripts
You can run Rune programs with the bundled CLI:
cargo run --bin rune -- run scripts/hello_world.rn
If you want to see detailed diagnostics of your program while it's running, you can use:
cargo run --bin rune -- run scripts/hello_world.rn --dump --trace
See --help for more information.
Running scripts from Rust
You can find more examples [in the examples folder].
The following is a complete example, including rich diagnostics using [termcolor]. It can be made much simpler if this is not needed.
[termcolor]: https://docs.rs/termcolor
use rune::{Context, Diagnostics, Source, Sources, Vm};
use rune::termcolor::{ColorChoice, StandardStream};
use rune::sync::Arc;
let context = Context::withdefaultmodules()?;
let mut sources = Sources::new(); sources.insert(Source::memory("pub fn add(a, b) { a + b }")?);
let mut diagnostics = Diagnostics::new();
let result = rune::prepare(&mut sources) .with_context(&context) .with_diagnostics(&mut diagnostics) .build_vm();
if !diagnostics.is_empty() { let mut writer = StandardStream::stderr(ColorChoice::Always); diagnostics.emit(&mut writer, &sources)?; }
let mut vm = result?;
let output = vm.call(["add"], (10i64, 20i64))?; let output: i64 = rune::from_value(output)?;
println!("{}", output);
[in the examples folder]: https://github.com/rune-rs/rune/tree/main/examples/examples [Open Issues]: https://github.com/rune-rs/rune/issues [support-anon-objects]: https://rune-rs.github.io/book/objects.html [support-anon-tuples]: https://rune-rs.github.io/book/tuples.html [support-async]: https://rune-rs.github.io/book/async.html [support-dynamic-vectors]: https://rune-rs.github.io/book/vectors.html [support-generators]: https://rune-rs.github.io/book/generators.html [support-hot-reloading]: https://rune-rs.github.io/book/hot_reloading.html [support-instance-functions]: https://rune-rs.github.io/book/instance_functions.html [support-macros]: https://rune-rs.github.io/book/macros.html [support-multithreading]: https://rune-rs.github.io/book/multithreading.html [support-patterns]: https://rune-rs.github.io/book/pattern_matching.html [support-reference-counted]: https://rune-rs.github.io/book/variables.html [support-rust-integration]: https://github.com/rune-rs/rune/tree/main/crates/rune-modules [support-scripts]: https://rune-rs.github.io/book/scripts.html [support-serde]: https://github.com/rune-rs/rune/blob/main/crates/rune-modules/src/json.rs [support-stack-isolation]: https://rune-rs.github.io/book/call_frames.html [support-structs]: https://rune-rs.github.io/book/structs.html [support-templates]: https://rune-rs.github.io/book/template_literals.html [support-try]: https://rune-rs.github.io/book/try_operator.html [support-virtual-machine]: https://rune-rs.github.io/book/the_stack.html