diff --git a/ablescript/src/interpret.rs b/ablescript/src/interpret.rs index cf85a10f..656583a9 100644 --- a/ablescript/src/interpret.rs +++ b/ablescript/src/interpret.rs @@ -355,10 +355,7 @@ impl ExecEnv { } let stmts = crate::parser::Parser::new(&code).init()?; - self.eval_stmts(&stmts).map_err(|x| Error { - span: span.clone(), - ..x - })?; + self.eval_stmts(&stmts)?; } } Ok(()) diff --git a/ablescript/src/variables.rs b/ablescript/src/variables.rs index 5d3eada3..3a5b186b 100644 --- a/ablescript/src/variables.rs +++ b/ablescript/src/variables.rs @@ -93,16 +93,11 @@ impl Value { Value::Abool(a) => a as _, Value::Bool(b) => b as _, Value::Functio(func) => match func { - // Compares lengths of functions: - // BfFunctio - Sum of lengths of instructions and length of tape - // AbleFunctio - Sum of argument count and body length - // Eval - Length of input code - Functio::BfFunctio { instructions, tape_len, } => (instructions.len() + tape_len) as _, - Functio::AbleFunctio { params, body } => (params.len() + format!("{:?}", body).len()) as _, + Functio::AbleFunctio { params, body } => (params.len() + body.len()) as _, Functio::Eval(s) => s.len() as _, }, Value::Int(i) => i, @@ -366,7 +361,32 @@ impl PartialOrd for Value { Value::Int(i) => Some(i.cmp(&other.into_i32())), Value::Bool(b) => Some(b.cmp(&other.into_bool())), Value::Abool(a) => a.partial_cmp(&other.into_abool()), - Value::Functio(_) => self.clone().into_i32().partial_cmp(&other.into_i32()), + Value::Functio(f) => { + // Compares lengths of functions: + // BfFunctio - Sum of lengths of instructions and length of tape + // AbleFunctio - Sum of argument count and body length + // Eval - Length of input code + + let selfl = match f { + Functio::BfFunctio { + instructions, + tape_len, + } => instructions.len() + tape_len, + Functio::AbleFunctio { params, body } => params.len() + body.len(), + Functio::Eval(s) => s.len(), + }; + + let otherl = match other.into_functio() { + Functio::BfFunctio { + instructions, + tape_len, + } => instructions.len() + tape_len, + Functio::AbleFunctio { params, body } => params.len() + body.len(), + Functio::Eval(s) => s.len(), + }; + + Some(selfl.cmp(&otherl)) + } Value::Cart(c) => Some(c.len().cmp(&other.into_cart().len())), } }