Fixed variable parse order

pull/2/head
Mark 2023-06-17 22:15:58 -07:00
parent 1671bbbade
commit 41bf1954a1
Signed by: Mark
GPG Key ID: AD62BB059C2AAEE4
3 changed files with 23 additions and 10 deletions

View File

@ -13,19 +13,29 @@ impl Context {
}
pub fn push_hist(&mut self, t: Expression) { self.history.push(t); }
pub fn push_var(&mut self, s: String, t: Expression) { self.variables.insert(s, t); }
pub fn push_var(&mut self, s: String, t: Expression) -> Result<(), ()> {
if self.valid_varible(&s) {
self.variables.insert(s, t);
return Ok(());
} else { return Err(()); }
}
pub fn del_var(&mut self, s: &String) { self.variables.remove(s); }
pub fn get_variable(&self, s: &String) -> Option<Expression> {
let v: Option<&Expression>;
if s == "ans" {
v = self.history.last();
} else {
v = self.variables.get(s);
}
if v.is_some() { Some(v.unwrap().clone()) } else { None }
}
pub fn valid_varible(&self, s: &str) -> bool {
return match s {
"ans" => false,
_ => true
}
}
}

View File

@ -59,14 +59,16 @@ pub fn evaluate(t: &Expression, context: &mut Context) -> Result<Expression, Eva
} else {
// Move down the tree
coords.push(0);
let n = root.get_at_coords(&coords[..]);
if let Some(n) = n {
if let Expression::Operator(Operator::Define, _) = n {
// Don't evaluate the first argument of a define.
// This prevents variables from being expanded before a re-assignment.
if let Expression::Operator(Operator::Define, _) = g {
*coords.last_mut().unwrap() += 1;
coords.push(0);
continue;
}
}
coords.push(0);
}
}

View File

@ -15,7 +15,8 @@ pub fn eval_operator(op: &Operator, args: &VecDeque<Expression>, context: &mut C
let b = &args[1];
if let Expression::Variable(s) = &args[0] {
context.push_var(s.clone(), b.clone());
let r = context.push_var(s.clone(), b.clone());
if r.is_err() { return Err(EvalError::BadDefineName); }
return Ok(Some(b.clone()));
} else { return Err(EvalError::BadDefineName); }
},