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