41 lines
1.2 KiB
Markdown
41 lines
1.2 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 the `Engine::optimize_ast` method,
|
|
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(
|
|
r"
|
|
if SCENARIO_1 {
|
|
do_work();
|
|
} else if SCENARIO_2 {
|
|
do_something();
|
|
} else if SCENARIO_3 {
|
|
do_something_else();
|
|
} else {
|
|
do_nothing();
|
|
}
|
|
")?;
|
|
|
|
// Create a new 'Scope' - put constants in it to aid optimization
|
|
let mut scope = Scope::new();
|
|
scope.push_constant("SCENARIO_1", true);
|
|
scope.push_constant("SCENARIO_2", false);
|
|
scope.push_constant("SCENARIO_3", false);
|
|
|
|
// Re-optimize the AST
|
|
let new_ast = engine.optimize_ast(&scope, master_ast.clone(), OptimizationLevel::Simple);
|
|
|
|
// 'new_ast' is essentially: 'do_work()'
|
|
```
|