symjit 2.25.2

a lightweight just-in-time (JIT) optimizer compiler
Documentation
use anyhow::Result;
pub use num_complex::{Complex, ComplexFloat};
use symjit::{Composer, Config, Defuns, Slot, Translator};

fn compile_evaluators() -> Result<symjit::Application> {
    let mut config = Config::default();
    config.set_complex(false);
    config.set_direct(false);

    let mut inner = Translator::new(config);
    inner.set_num_params(2);
    inner.append_mul(&Slot::Out(0), &[Slot::Param(0), Slot::Param(1)], 0)?;
    let f = inner.compile()?.seal()?;

    let mut defuns = Defuns::new();
    defuns.add_applet("f", f);

    let mut config = Config::default();
    config.set_complex(false);
    config.set_direct(false);
    config.set_defuns(defuns);

    let mut outer = Translator::new(config);
    outer.set_num_params(2);

    outer.append_fun(
        &Slot::Temp(0),
        "f",
        &[Slot::Param(0), Slot::Param(1)],
        false,
    )?;

    outer.append_add(&Slot::Out(0), &[Slot::Temp(0), Slot::Param(1)], 0)?;
    Ok(outer.compile()?)
}

fn main() -> Result<()> {
    let args = [5.0, 2.0];
    let expected = 12.0;
    let ret = compile_evaluators()?.evaluate_single(&args);

    eprintln!("expected : {expected}");
    eprintln!("returned : {ret}");

    assert_eq!(ret, expected);
    Ok(())
}