From 5ccc6e5ec8a433f68bfeb17e8dcedec5b62a36a9 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Wed, 17 Jan 2024 18:24:21 +0100 Subject: First sketch of matheval --- src/main.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/main.rs (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..313769f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,58 @@ +pub mod context; +pub mod expression; +pub mod function; +pub mod operation; +pub mod string; + +use std::collections::HashMap; + +use expression::Expression; +use function::Function; +use operation::Operation; + +use crate::context::Context; + +fn add(a: f64, b: f64) -> f64 { + a + b +} + +fn mul(a: f64, b: f64) -> f64 { + a * b +} + +fn div(a: f64, b: f64) -> f64 { + a / b +} + +fn pow(a: f64, b: f64) -> f64 { + a.powf(b) +} + +fn sqrt(a: f64) -> f64 { + a.sqrt() +} + +impl Function for T +where + T: Fn(f64) -> f64, +{ + fn eval(&self, args: function::FunctionArgument) -> f64 { + self(args.get(0)) + } +} + +fn main() { + let expr = "(2 + (3 + 10) * (3 + 10)) * 2"; + + let mut funcs : HashMap> = HashMap::new(); + funcs.insert("sqrt".to_string(), Box::new(&sqrt)); + let ctx: Context = Context::new() + .with_operations(opvec![('+', &add), ('*', &mul), ('/', &div), ('^', &pow)]) + .with_functions(funcs); + let value = Expression::from_string(expr); + + match value.evaluate(&ctx) { + Ok(res) => println!("{} = {}", expr, res), + Err(err) => println!("Error: {}", err), + } +} -- cgit v1.2.3-70-g09d2