sunflower/src/statement.rs

36 lines
1.0 KiB
Rust

use crate::{env::Env, expression::Expression, function::FunctionMap};
#[derive(Debug, Clone)]
pub enum Statement {
Assignment(String, Expression),
Expression(Expression),
Print(Expression),
While(Expression, Vec<Statement>),
}
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);
}
}
}
}
}
}