1use crate::ast::{Expr, Statement};
7use crate::environment::Environment;
8
9pub fn evaluate(statement: Statement, env: &mut Environment) -> Result<f64, String> {
18 match statement {
19 Statement::Assign(var, expr) => {
20 let value = eval_expr(expr, env)?;
21 env.set(var, value);
22 Ok(value)
23 }
24 Statement::Expr(expr) => eval_expr(expr, env),
25 }
26}
27
28fn eval_expr(expr: Expr, env: &Environment) -> Result<f64, String> {
29 match expr {
30 Expr::Number(n) => Ok(n),
31 Expr::Add(lhs, rhs) => Ok(eval_expr(*lhs, env)? + eval_expr(*rhs, env)?),
32 Expr::Sub(lhs, rhs) => Ok(eval_expr(*lhs, env)? - eval_expr(*rhs, env)?),
33 Expr::Variable(var) => env
34 .get(&var)
35 .cloned()
36 .ok_or_else(|| format!("Variable '{}' not found", var)),
37 }
38}