pub fn compile(source: &str) -> Result<Function, CompilationError>Expand description
Compile an alleged dice expression into a function. Optimize the function using the standard optimizer.
§Parameters
source: The source code to compile.
§Returns
The compiled function.
§Errors
CompilationFailedif the function could not be compiled.OptimizationFailedif the function could not be optimized.
§Examples
Compile and optimize a dice expression and evaluate it multiple times:
use xdy::{compile, CompilationError, Evaluator};
use rand::rng;
let function = compile("3D6")?;
let mut evaluator = Evaluator::new(function);
let results = (0..10)
.flat_map(|_| evaluator.evaluate(vec![], &mut rng()))
.collect::<Vec<_>>();
assert!(results.len() == 10);
assert!(
results.iter().all(|result| 3 <= result.result && result.result <= 18)
);Compile and optimize a dice expression with formal parameters and evaluate it multiple times with different arguments:
use xdy::{compile, CompilationError, Evaluator};
use rand::rng;
let function = compile("x: 1D6 + {x}")?;
let mut evaluator = Evaluator::new(function);
let results = (0..10)
.flat_map(|x| evaluator.evaluate(vec![x], &mut rng()))
.collect::<Vec<_>>();
assert!(results.len() == 10);
(0..10).for_each(|i| {
let x = i as i32;
assert!(1 + x <= results[i].result && results[i].result <= 6 + x);
});Compile and optimize a dice expression with environmental variables and evaluate it multiple times:
use xdy::{compile, EvaluationError, Evaluator};
use rand::rng;
let function = compile("1D6 + {x}")?;
let mut evaluator = Evaluator::new(function);
evaluator.bind("x", 3)?;
let results = (0..10)
.flat_map(|x| evaluator.evaluate(vec![], &mut rng()))
.collect::<Vec<_>>();
assert!(results.len() == 10);
assert!(
results.iter().all(|result| 4 <= result.result && result.result <= 9)
);