aboutsummaryrefslogtreecommitdiff
path: root/src/expression_function.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/expression_function.rs')
-rw-r--r--src/expression_function.rs18
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",