36 lines
1.0 KiB
Rust
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|