Function compile

Source
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

§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)
);