extern crate alloc;
use exp_rs::EvalContext;
#[cfg(feature = "libm")]
use libm::{cos, exp, log, sin, sqrt, tan};
use std::println;
#[cfg(not(feature = "libm"))]
macro_rules! c_fn {
(sin) => {
|args: &[f64]| args[0].sin()
};
(cos) => {
|args: &[f64]| args[0].cos()
};
(tan) => {
|args: &[f64]| args[0].tan()
};
(exp) => {
|args: &[f64]| args[0].exp()
};
(log) => {
|args: &[f64]| args[0].ln()
};
(sqrt) => {
|args: &[f64]| args[0].sqrt()
};
}
#[cfg(feature = "libm")]
macro_rules! c_fn {
($name:ident) => {
|args: &[f64]| $name(args[0])
};
}
#[cfg(all(feature = "f32", not(feature = "libm")))]
macro_rules! c_fn {
(sin) => {
|args: &[f32]| args[0].sin()
};
(cos) => {
|args: &[f32]| args[0].cos()
};
(tan) => {
|args: &[f32]| args[0].tan()
};
(exp) => {
|args: &[f32]| args[0].exp()
};
(log) => {
|args: &[f32]| args[0].ln()
};
(sqrt) => {
|args: &[f32]| args[0].sqrt()
};
}
#[cfg(all(feature = "f32", feature = "libm"))]
macro_rules! c_fn {
($name:ident) => {
|args: &[f32]| $name(args[0])
};
}
fn main() {
let mut ctx = EvalContext::new();
#[cfg(not(feature = "f32"))]
{
let _ = ctx.register_native_function("sin", 1, c_fn!(sin));
let _ = ctx.register_native_function("cos", 1, c_fn!(cos));
let _ = ctx.register_native_function("tan", 1, c_fn!(tan));
let _ = ctx.register_native_function("exp", 1, c_fn!(exp));
let _ = ctx.register_native_function("log", 1, c_fn!(log));
let _ = ctx.register_native_function("sqrt", 1, c_fn!(sqrt));
}
#[cfg(feature = "f32")]
{
#[cfg(feature = "libm")]
{
let _ = ctx.register_native_function("sin", 1, c_fn!(sinf));
let _ = ctx.register_native_function("cos", 1, c_fn!(cosf));
let _ = ctx.register_native_function("tan", 1, c_fn!(tanf));
let _ = ctx.register_native_function("exp", 1, c_fn!(expf));
let _ = ctx.register_native_function("log", 1, c_fn!(logf));
let _ = ctx.register_native_function("sqrt", 1, c_fn!(sqrtf));
}
#[cfg(not(feature = "libm"))]
{
let _ = ctx.register_native_function("sin", 1, c_fn!(sin));
let _ = ctx.register_native_function("cos", 1, c_fn!(cos));
let _ = ctx.register_native_function("tan", 1, c_fn!(tan));
let _ = ctx.register_native_function("exp", 1, c_fn!(exp));
let _ = ctx.register_native_function("log", 1, c_fn!(log));
let _ = ctx.register_native_function("sqrt", 1, c_fn!(sqrt));
}
}
let exprs = [
"sin(1.0)",
"cos(1.0)",
"sqrt(9)",
"sin(0.5) + cos(0.5) + 42",
"sin(2.0) + cos(2.0) + 42 + sqrt(16)",
];
for expr in &exprs {
match exp_rs::engine::interp(expr, Some(std::rc::Rc::new(ctx.clone()))) {
Ok(val) => {
println!("{} = {}", expr, val);
}
Err(e) => {
println!("Error evaluating {}: {}", expr, e);
}
}
}
}