mirror of
https://github.com/rm-dr/daisy
synced 2025-07-03 17:19:41 -07:00
Added linelocation to all errors
This commit is contained in:
@ -1,56 +1,58 @@
|
||||
use std::collections::VecDeque;
|
||||
|
||||
use crate::parser::Expression;
|
||||
use crate::parser::Function;
|
||||
use crate::parser::Operator;
|
||||
use crate::parser::LineLocation;
|
||||
use super::EvalError;
|
||||
|
||||
pub fn eval_function(g: &Expression) -> Result<Expression, (LineLocation, EvalError)> {
|
||||
|
||||
let Expression::Operator(loc, Operator::Function(f), args) = g else {panic!()};
|
||||
|
||||
pub fn eval_function(f: &Function, args: &VecDeque<Expression>) -> Result<Expression, EvalError> {
|
||||
if args.len() != 1 {panic!()};
|
||||
let a = &args[0];
|
||||
let Expression::Quantity(q) = a else {panic!()};
|
||||
let Expression::Quantity(l, q) = a else {panic!()};
|
||||
|
||||
|
||||
match f {
|
||||
Function::NoUnit => { return Ok(Expression::Quantity(q.without_unit())); }
|
||||
Function::ToBase => { return Ok(Expression::Quantity(q.convert_to_base())); }
|
||||
Function::NoUnit => { return Ok(Expression::Quantity(*loc + *l, q.without_unit())); }
|
||||
Function::ToBase => { return Ok(Expression::Quantity(*loc + *l, q.convert_to_base())); }
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if !q.unitless() {
|
||||
return Err(EvalError::IncompatibleUnit);
|
||||
return Err((*loc + *l, EvalError::IncompatibleUnit));
|
||||
}
|
||||
|
||||
match f {
|
||||
Function::Abs => { return Ok(Expression::Quantity(q.abs())); },
|
||||
Function::Floor => { return Ok(Expression::Quantity(q.floor())); },
|
||||
Function::Ceil => { return Ok(Expression::Quantity(q.ceil())); },
|
||||
Function::Round => { return Ok(Expression::Quantity(q.round())); },
|
||||
Function::Abs => { return Ok(Expression::Quantity(*loc + *l, q.abs())); },
|
||||
Function::Floor => { return Ok(Expression::Quantity(*loc + *l, q.floor())); },
|
||||
Function::Ceil => { return Ok(Expression::Quantity(*loc + *l, q.ceil())); },
|
||||
Function::Round => { return Ok(Expression::Quantity(*loc + *l, q.round())); },
|
||||
|
||||
Function::NaturalLog => { return Ok(Expression::Quantity(q.ln())); },
|
||||
Function::TenLog => { return Ok(Expression::Quantity(q.log10())); },
|
||||
Function::NaturalLog => { return Ok(Expression::Quantity(*loc + *l, q.ln())); },
|
||||
Function::TenLog => { return Ok(Expression::Quantity(*loc + *l, q.log10())); },
|
||||
|
||||
Function::Sin => { return Ok(Expression::Quantity(q.sin())); },
|
||||
Function::Cos => { return Ok(Expression::Quantity(q.cos())); },
|
||||
Function::Tan => { return Ok(Expression::Quantity(q.tan())); },
|
||||
Function::Asin => { return Ok(Expression::Quantity(q.asin())); },
|
||||
Function::Acos => { return Ok(Expression::Quantity(q.acos())); },
|
||||
Function::Atan => { return Ok(Expression::Quantity(q.atan())); },
|
||||
Function::Sin => { return Ok(Expression::Quantity(*loc + *l, q.sin())); },
|
||||
Function::Cos => { return Ok(Expression::Quantity(*loc + *l, q.cos())); },
|
||||
Function::Tan => { return Ok(Expression::Quantity(*loc + *l, q.tan())); },
|
||||
Function::Asin => { return Ok(Expression::Quantity(*loc + *l, q.asin())); },
|
||||
Function::Acos => { return Ok(Expression::Quantity(*loc + *l, q.acos())); },
|
||||
Function::Atan => { return Ok(Expression::Quantity(*loc + *l, q.atan())); },
|
||||
|
||||
Function::Csc => { return Ok(Expression::Quantity(q.csc())); },
|
||||
Function::Sec => { return Ok(Expression::Quantity(q.sec())); },
|
||||
Function::Cot => { return Ok(Expression::Quantity(q.cot())); },
|
||||
Function::Csc => { return Ok(Expression::Quantity(*loc + *l, q.csc())); },
|
||||
Function::Sec => { return Ok(Expression::Quantity(*loc + *l, q.sec())); },
|
||||
Function::Cot => { return Ok(Expression::Quantity(*loc + *l, q.cot())); },
|
||||
|
||||
Function::Sinh => { return Ok(Expression::Quantity(q.sinh())); },
|
||||
Function::Cosh => { return Ok(Expression::Quantity(q.cosh())); },
|
||||
Function::Tanh => { return Ok(Expression::Quantity(q.tanh())); },
|
||||
Function::Asinh => { return Ok(Expression::Quantity(q.asinh())); },
|
||||
Function::Acosh => { return Ok(Expression::Quantity(q.acosh())); },
|
||||
Function::Atanh => { return Ok(Expression::Quantity(q.atanh())); },
|
||||
Function::Sinh => { return Ok(Expression::Quantity(*loc + *l, q.sinh())); },
|
||||
Function::Cosh => { return Ok(Expression::Quantity(*loc + *l, q.cosh())); },
|
||||
Function::Tanh => { return Ok(Expression::Quantity(*loc + *l, q.tanh())); },
|
||||
Function::Asinh => { return Ok(Expression::Quantity(*loc + *l, q.asinh())); },
|
||||
Function::Acosh => { return Ok(Expression::Quantity(*loc + *l, q.acosh())); },
|
||||
Function::Atanh => { return Ok(Expression::Quantity(*loc + *l, q.atanh())); },
|
||||
|
||||
Function::Csch => { return Ok(Expression::Quantity(q.csch())); },
|
||||
Function::Sech => { return Ok(Expression::Quantity(q.sech())); },
|
||||
Function::Coth => { return Ok(Expression::Quantity(q.coth())); },
|
||||
Function::Csch => { return Ok(Expression::Quantity(*loc + *l, q.csch())); },
|
||||
Function::Sech => { return Ok(Expression::Quantity(*loc + *l, q.sech())); },
|
||||
Function::Coth => { return Ok(Expression::Quantity(*loc + *l, q.coth())); },
|
||||
|
||||
Function::ToBase
|
||||
| Function::NoUnit
|
||||
|
Reference in New Issue
Block a user