feat(eval): add extremely basic evaluation
added a basic `eval_expr` function that evaluates an expression. it still does not reduce/simplify anything, and it cannot evaluate to fractions yet
This commit is contained in:
4 files changed
+44
-2
No files matched your search
+1
-1
@@ -4,4 +4,4 @@ version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
rust_decimal = { version = "1.43.0", features = ["macros"] }
|
||||
rust_decimal = { version = "1.43.0", features = ["macros", "maths"] }
|
||||
+1
-1
@@ -13,7 +13,7 @@ fn main() -> io::Result<()> {
|
||||
|
||||
let line = line.unwrap();
|
||||
let parsed = math::parse(line.trim());
|
||||
println!("{}", parsed);
|
||||
println!("{}", math::eval(parsed));
|
||||
|
||||
prompt()?;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
use rust_decimal::MathematicalOps;
|
||||
|
||||
use crate::math::types::{Expression, Operator};
|
||||
|
||||
pub fn eval_expr(expr: Expression) -> Expression {
|
||||
match expr {
|
||||
Expression::Number(_) => expr,
|
||||
Expression::Variable(_) => expr,
|
||||
Expression::Fraction(numberator, denominator) => {
|
||||
// TODO: implement proper fraction handling
|
||||
eval_expr(Expression::Operation(
|
||||
Operator::Divide,
|
||||
numberator,
|
||||
denominator,
|
||||
))
|
||||
}
|
||||
Expression::Operation(operator, left, right) => eval_operation(operator, *left, *right),
|
||||
Expression::Function(_name, _params) => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
fn eval_operation(operator: Operator, left: Expression, right: Expression) -> Expression {
|
||||
let left = eval_expr(left);
|
||||
let right = eval_expr(right);
|
||||
match (&left, &right) {
|
||||
(Expression::Number(left), Expression::Number(right)) => match operator {
|
||||
Operator::Add => Expression::Number(left + right),
|
||||
Operator::Subtract => Expression::Number(left - right),
|
||||
Operator::Multiply => Expression::Number(left * right),
|
||||
Operator::Divide => Expression::Number(left / right),
|
||||
Operator::Modulo => Expression::Number(left % right),
|
||||
Operator::Power => Expression::Number(left.powd(*right)),
|
||||
},
|
||||
// TODO: implement handling for variables
|
||||
_ => Expression::Operation(operator, Box::new(left), Box::new(right)),
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
use crate::math::types::Expression;
|
||||
|
||||
mod display;
|
||||
mod eval;
|
||||
mod lexer;
|
||||
mod parser;
|
||||
|
||||
@@ -11,3 +12,7 @@ pub fn parse(source: &str) -> Expression {
|
||||
let mut parser = parser::from(lexer.collect());
|
||||
parser.parse()
|
||||
}
|
||||
|
||||
pub fn eval(expr: Expression) -> Expression {
|
||||
eval::eval_expr(expr)
|
||||
}
|
||||
Reference in new issue
Block a user