Macro arithmetic_eval::wrap_fn_with_context[][src]

macro_rules! wrap_fn_with_context {
    (0, $function:expr) => { ... };
    (1, $function:expr) => { ... };
    (2, $function:expr) => { ... };
    (3, $function:expr) => { ... };
    (4, $function:expr) => { ... };
    (5, $function:expr) => { ... };
    (6, $function:expr) => { ... };
    (7, $function:expr) => { ... };
    (8, $function:expr) => { ... };
    (9, $function:expr) => { ... };
    (10, $function:expr) => { ... };
}
Expand description

Analogue of wrap_fn macro that injects the CallContext as the first argument. This can be used to call functions within the implementation.

As with wrap_fn, this macro must be called with 2 args: the arity of the function (excluding CallContext), and then the function / closure itself.

Examples

fn map_array<'a>(
    context: &mut CallContext<'_, 'a, f32>,
    array: Vec<Value<'a, f32>>,
    map_fn: Function<'a, f32>,
) -> Result<Vec<Value<'a, f32>>, Error<'a>> {
    array
        .into_iter()
        .map(|value| {
            let arg = context.apply_call_span(value);
            map_fn.evaluate(vec![arg], context)
        })
        .collect()
}

let program = "(1, 2, 3).map(|x| x + 3) == (4, 5, 6)";
let program = Untyped::<F32Grammar>::parse_statements(program)?;

let module = Environment::new()
    .insert_native_fn("map", wrap_fn_with_context!(2, map_array))
    .compile_module("test_map", &program)?;
assert_eq!(module.run()?, Value::Bool(true));