51 lines
1.4 KiB
Markdown
51 lines
1.4 KiB
Markdown
Re-Optimize an AST
|
|
==================
|
|
|
|
{{#include ../../links.md}}
|
|
|
|
Sometimes it is more efficient to store one single, large script with delimited code blocks guarded by
|
|
constant variables. This script is compiled once to an [`AST`].
|
|
|
|
Then, depending on the execution environment, constants are passed into the [`Engine`] and the
|
|
[`AST`] is _re_-optimized based on those constants via `Engine::optimize_ast`, effectively pruning
|
|
out unused code sections.
|
|
|
|
The final, optimized [`AST`] is then used for evaluations.
|
|
|
|
```rust
|
|
// Compile master script to AST
|
|
let master_ast = engine.compile(
|
|
"
|
|
fn do_work() {
|
|
// Constants in scope are also propagated into functions
|
|
print(SCENARIO);
|
|
}
|
|
|
|
switch SCENARIO {
|
|
1 => do_work(),
|
|
2 => do_something(),
|
|
3 => do_something_else(),
|
|
_ => do_nothing()
|
|
}
|
|
")?;
|
|
|
|
for n in 0..5_i64 {
|
|
// Create a new scope - put constants in it to aid optimization
|
|
let mut scope = Scope::new();
|
|
scope.push_constant("SCENARIO", n);
|
|
|
|
// Re-optimize the AST
|
|
let new_ast = engine.optimize_ast(&scope, master_ast.clone(), OptimizationLevel::Simple);
|
|
|
|
// Run it
|
|
engine.run_ast(&new_ast)?;
|
|
}
|
|
```
|
|
|
|
```admonish note.small "Constants propagation"
|
|
|
|
Beware that [constants] inside the custom [`Scope`] will also be propagated to [functions] defined
|
|
within the script while normally such [functions] are _pure_ and cannot see [variables]/[constants]
|
|
within the global [`Scope`].
|
|
```
|