Features of Rhai


* Simple language similar to JavaScript+Rust with dynamic typing.

* Tight integration with native Rust [functions] and [types][custom types] including
  [getters/setters], [methods] and [indexers].

* Freely pass Rust values into a script as [variables]/[constants] via an external [`Scope`] –
  all clonable Rust types are supported seamlessly without the need to implement any special trait.

* Easily [call a script-defined function]({{rootUrl}}/engine/call-fn.md) from Rust.

* Very few additional dependencies – right now only [`smallvec`](https://crates.io/crates/smallvec),
  [`num-traits`](https://crates.io/crates/num-traits), [`ahash`](https://crates.io/crates/ahash),
  [`bitflags`](https://crates.io/crates/bitflags) and [`SmartString`]; for [`no-std`] and [WASM] builds,
  a number of additional dependencies are pulled in to provide for missing functionalities.

* [Plugins] system powered by procedural macros simplifies custom API development.

* Fairly efficient evaluation (1 million iterations in 0.3 sec on a single-core, 2.3 GHz Linux VM).

* Compile once to [AST][`AST`] for repeated evaluations.

* Scripts are [optimized][script optimization] (useful for template-based machine-generated scripts).

* [Function overloading]({{rootUrl}}/language/overload.md).

* [Operator overloading]({{rootUrl}}/rust/operators.md).

* Organize code base with dynamically-loadable [modules], optionally overriding the
  [resolution][module resolver] process.

* Dynamic dispatch via [function pointers] with additional support for [currying].

* [Closures] that can capture shared variables.

* Some support for [object-oriented programming (OOP)][OOP].

* Hook into variables access via a [variable resolver], or control definition of variables via a
  [variable definition filter].

* Relatively little `unsafe` code (yes there are some for performance reasons).

* Sand-boxed – the scripting [`Engine`], if declared immutable, cannot mutate the containing
  environment unless [explicitly permitted]({{rootUrl}}/patterns/control.md).

* Passes Miri.

* [_Don't Panic_][safety] guarantee – Any panic is a bug. It never panics the host system.

* Protected against malicious attacks (such as [stack-overflow][maximum call stack depth],
  [over-sized data][maximum length of strings], and [runaway scripts][maximum number of operations]
  etc.) that may come from untrusted third-party user-land scripts.

* Track script evaluation [progress] and manually terminate a script run.

* Re-entrant scripting [`Engine`] can be made `Send + Sync` (via the [`sync`] feature).

* Support for [`Decimal`][rust_decimal] numbers.

* Serialization/deserialization support via [`serde`](https://crates.io/crates/serde).

* Support for [minimal builds] by excluding unneeded language [features].

* Supports [most build targets](targets.md) including `no-std` and [WASM].

* Surgically [disable keywords and operators] to restrict the language.

* Use as a [DSL] by defining [custom operators] and/or extending the language with [custom syntax].

* A [debugging][debugger] interface provides powerful debugging support.