1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
use std::collections::HashMap; use std::rc::Rc; use std::cell::RefCell; use crate::object::Object; pub type Env = Rc<RefCell<Environment>>; #[derive(Debug, Default, Clone, PartialEq)] pub struct Environment { store: HashMap<String, Rc<Object>>, outer: Option<Env> } impl Environment { pub fn new_enclosed_environment(outer: &Env) -> Self { let mut env: Environment = Default::default(); env.outer = Some(Rc::clone(outer)); return env; } pub fn get(&self, name: &str) -> Option<Rc<Object>> { match self.store.get(name) { Some(obj) => Some(Rc::clone(obj)), None => { if let Some(outer) = &self.outer { return outer.borrow().get(name); } else { return None; } } } } pub fn set(&mut self, name: String, val: Rc<Object>) { self.store.insert(name, val); } }