rhai/doc/src/engine/optimize/reoptimize.md
Stephen Chung d6a08be223 Refactor.
2020-06-29 23:55:28 +08:00

1.2 KiB

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.

// 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()'