diff options
Diffstat (limited to 'src/expression_function.rs')
| -rw-r--r-- | src/expression_function.rs | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/src/expression_function.rs b/src/expression_function.rs index 35eba5f..138891f 100644 --- a/src/expression_function.rs +++ b/src/expression_function.rs @@ -1,12 +1,11 @@ use std::{collections::HashMap, iter::zip}; +use std::sync::Arc; use crate::{ - commonsense_functions, commonsense_operations, functions, complex::Complex, context::Context, expression::Expression, - operation::Operation, - function::{Function, FunctionArgument} + function::{Function, FunctionArgument, EmptyFunction} }; pub struct ExpressionFunction { @@ -38,17 +37,14 @@ impl ExpressionFunction { } impl Function for ExpressionFunction { - fn eval(&self, args: FunctionArgument) -> Result<Complex, String> { + fn eval(&self, args: FunctionArgument, ctx: &Context) -> Result<Complex, String> { if args.len() == self.args.len() { - let mut vars = HashMap::new(); + let mut nctx = ctx.clone(); for (n, v) in zip(self.args.iter(), args.data().iter()) { - vars.insert(n.to_string(), v.clone()); + nctx.set_variable(n, *v) } - let ctx = Context::new() - .with_variables(vars) - .with_functions(commonsense_functions! {}) - .with_operations(commonsense_operations! {}); - self.expr.evaluate(&ctx) + nctx.set_function(self.name(), Arc::new(EmptyFunction {})); + self.expr.evaluate(&nctx) } else { Err(format!( "{} takes {} parameters", |