rune logo
Visit the site 🌐Read the book 📖 # rune github crates.io docs.rs build status chat on discord

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 * Runs a compact representation of the language on top of an efficient [stack-based virtual machine][support-virtual-machine]. * Clean [Rust integration 💻][support-rust-integration]. * Memory safe through [reference counting 📖][support-reference-counted]. * [Awesome macros 📖][support-macros]. * [Template literals 📖][support-templates]. * [Try operators 📖][support-try]. * [Pattern matching 📖][support-patterns]. * [Structs and enums 📖][support-structs] with associated data and functions. * Dynamic [vectors 📖][support-dynamic-vectors], [objects 📖][support-anon-objects], and [tuples 📖][support-anon-tuples] with out-of-the-box [serde support 💻][support-serde]. * First-class [async support 📖][support-async]. * [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: ```text 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: ```text cargo run --bin rune -- run scripts/hello_world.rn --dump-unit --trace --dump-vm ``` 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 ```rust use rune::{Context, Diagnostics, Source, Sources, Vm}; use rune::termcolor::{ColorChoice, StandardStream}; use std::sync::Arc; let context = Context::with_default_modules()?; let runtime = Arc::new(context.runtime()?); 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(); if !diagnostics.is_empty() { let mut writer = StandardStream::stderr(ColorChoice::Always); diagnostics.emit(&mut writer, &sources)?; } let unit = result?; let mut vm = Vm::new(runtime, Arc::new(unit)); 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-instance-functions]: https://rune-rs.github.io/book/instance_functions.html [support-macros]: https://rune-rs.github.io/book/macros.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-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