use super::Value; use std::collections::HashMap; use std::rc::Rc; use std::cell::RefCell; #[derive(Debug)] pub struct Env { pub values: HashMap, pub parent: Option>>, } impl Env { pub fn new(parent: Option>>) -> Self { Self { values: HashMap::new(), parent, } } pub fn define(&mut self, name: String, val: Value) { self.values.insert(name, val); } pub fn assign(&mut self, name: &str, val: Value) -> bool { if self.values.contains_key(name) { self.values.insert(name.to_string(), val); true } else if let Some(parent) = &self.parent { parent.borrow_mut().assign(name, val) } else { false } } pub fn get(&self, name: &str) -> Option { if let Some(val) = self.values.get(name) { Some(val.clone()) } else if let Some(parent) = &self.parent { parent.borrow().get(name) } else { None } } }