diff --git a/src/eval.rs b/src/eval.rs index 46f5a25..bdc2351 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -45,40 +45,45 @@ fn eval_inner( * 1. make new ast * 2. call process_ctr on ast.car * 3. set new.car to result - * 3. if cdr is an AST - * - set first_item to false - * - set new.cdr to result of process_ctr(ast.ctr) * 4. else call process_ctr on cdr + * (set first_item to false) * (and set new.cdr to result) * 5. return new ast */ let ret: Ast; let mret = ret.clone().borrow_mut(); - let ret_inner = ast.clone().borrow_mut(); - mret.car = process_ctr( - ret_inner.car, + let ast_inner = ast.clone().borrow_mut(); + + match process_ctr( + ast_inner.car, vars.clone(), funcs.clone(), sym_loose, - first_item - ); + first_item, + mret.cdr + ) { + Ok(ctr) => { + mret.car = ctr + }, + Err(err) => { + return Err(err) + } + } - if let Ctr::Seg(s) = ret_inner.cdr { - mret.cdr = process_ctr( - ret_inner.cdr, - vars.clone(), - funcs.clone(), - sym_loose, - false - ); - } else { - mret.cdr = process_ctr( - ret_inner.cdr, - vars.clone(), - funcs.clone(), - sym_loose, - first_item - ); + match process_ctr( + ast_inner.cdr, + vars.clone(), + funcs.clone(), + sym_loose, + false, + RefCell::new(Rc::clone(Ctr::None)) + ) { + Ok(ctr) => { + mret.cdr = ctr + }, + Err(err) => { + return Err(err) + } } } @@ -99,14 +104,17 @@ fn process_ctr( */ match ctr { - Symbol(token) => { + Ctr::Symbol(token) => { let mut tok = token; - if let Some(s) = vt.borrow().get(token) { + if let Some(s) = vars.borrow().get(token) { // is function, or variable alias? - if first_item && let Symbol(t) = s { - if let Some(f) = ft.borrow().get(t) { - tok = t; + if first_item { + if let Ctr::Symbol(t) = s { + if let Some(f) = funcs.borrow().get(t) { + tok = t; + } + } // is a basic value. } else { @@ -118,14 +126,25 @@ fn process_ctr( return Err("variable not found") } - if first_item && let Some(f) = ft.borrow().get(tok) { - match func_call(f, rest, vars.clone(), funcs.clone()) { - Ok(a) => Ok(Ctr::Seg(a.borrow().clone())), - Err(s) => Err(s) + if first_item { + if let Some(f) = funcs.borrow().get(tok) { + match func_call(f, rest, vars.clone(), funcs.clone()) { + Ok(a) => Ok(Ctr::Seg(a.borrow().clone())), + Err(s) => Err(s) + } + } + } + }, + Ctr::Seg(tree) => { + match eval(tree, vars, funcs, sym_loose) { + Ok(ast) => { + Ok(ast.borrow()) + }, + Err(e) => { + Err(e) } } }, - Seg(tree) => eval_inner(tree, vars, funcs, sym_loose, first_item), _ => Ok(ctr.clone()) } }