use crate::{env::Env, expression::Expression, function::FunctionMap}; #[derive(Debug, Clone)] pub enum Statement { Assignment(String, Expression), Expression(Expression), Print(Expression), While(Expression, Vec), } impl Statement { pub fn eval(&self, env: &Env, f: &FunctionMap) { match self { Statement::Assignment(name, expr) => { let value = expr.eval(env, f); env.set(name, value); } Statement::Expression(expr) => { expr.eval(env, f); } Statement::Print(expr) => { let value = expr.eval(env, f); println!("{}", value); } Statement::While(expr, body) => { while expr.eval(env, f).is_truthy() { let body_env = Env::new_with_parent(env); for stmt in body.iter() { stmt.eval(&body_env, f); } } } } } }