Added unit conversion prototype

This commit is contained in:
2023-04-11 11:48:15 -07:00
parent 7ecdfae6fc
commit 600c5f76cc
4 changed files with 110 additions and 17 deletions

View File

@@ -13,6 +13,7 @@ use crate::quantity::Quantity;
#[repr(usize)]
pub enum Operator {
ModuloLong = 0, // Mod invoked with "mod"
UnitConvert,
Subtract,
Add,
Divide,
@@ -99,6 +100,14 @@ impl Operator {
);
},
Operator::UnitConvert => {
return format!(
"{} to {}",
self.add_parens_to_arg(&args[0]),
self.add_parens_to_arg(&args[1])
);
},
Operator::Modulo => {
return format!(
"{} % {}",
@@ -211,6 +220,7 @@ impl Operator {
"i*" => {Some( Operator::ImplicitMultiply )},
"%" => {Some( Operator::Modulo )},
"mod" => {Some( Operator::ModuloLong )},
"to" => {Some( Operator::UnitConvert )},
"^"|"**" => {Some( Operator::Power )},
"!" => {Some( Operator::Factorial )},
"sqrt"|"rt"|"" => {Some( Operator::Sqrt )},
@@ -327,6 +337,7 @@ impl Operator {
| Operator::Modulo
| Operator::Power
| Operator::ModuloLong
| Operator::UnitConvert
=> { Token::Operator(self, args) },
}
}
@@ -420,6 +431,23 @@ impl Operator{
} else { panic!(); }
},
Operator::UnitConvert
=> {
if args.len() != 2 {panic!()};
let a = args[0].as_number();
let b = args[1].as_number();
if let Token::Number(va) = a {
if let Token::Number(vb) = b {
let n = va.convert_to(vb);
if n.is_none() {
return Err(EvalError::IncompatibleUnit);
}
return Ok(Token::Number(n.unwrap()));
} else { panic!(); }
} else { panic!(); }
},
Operator::Power => {
if args.len() != 2 {panic!()};
let a = args[0].as_number();