lisp-rs 2.0.2

Lisp interpreter in Rust
Documentation
use crate::object::Object;
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;

#[derive(Debug, PartialEq, Default)]
pub struct Env {
  parent: Option<Rc<RefCell<Env>>>,
  vars: HashMap<String, Object>,
}

impl Env {
  pub fn new() -> Self {
    Default::default()
  }

  pub fn update(&mut self, data: Rc<RefCell<Self>>) {
    self.vars.extend(
      data
        .borrow()
        .vars
        .iter()
        .map(|(k, v)| (k.clone(), v.clone())),
    );
  }

  pub fn extend(parent: Rc<RefCell<Self>>) -> Env {
    Env {
      vars: HashMap::new(),
      parent: Some(parent),
    }
  }

  pub fn get(&self, name: &str) -> Option<Object> {
    match self.vars.get(name) {
      Some(value) => Some(value.clone()),
      None => self
        .parent
        .as_ref()
        .and_then(|o| o.borrow().get(name).clone()),
    }
  }

  pub fn set(&mut self, name: &str, val: Object) {
    self.vars.insert(name.to_string(), val);
  }
}