From 8f5b0f1040de849da3fb5ade645308e7bbe7f025 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Sat, 25 Oct 2014 13:00:01 -0500 Subject: Rust: add step3_env --- rust/src/env.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 rust/src/env.rs (limited to 'rust/src/env.rs') diff --git a/rust/src/env.rs b/rust/src/env.rs new file mode 100644 index 0000000..9c98f23 --- /dev/null +++ b/rust/src/env.rs @@ -0,0 +1,44 @@ +use std::rc::Rc; +use std::cell::RefCell; +use std::collections::HashMap; + +use types::{MalVal,MalRet,Nil}; + +struct EnvType { + data: HashMap, + outer: Option, +} + +pub type Env = Rc>; + +pub fn env_new(outer: Option) -> Env { + Rc::new(RefCell::new(EnvType{data: HashMap::new(), outer: outer})) +} + +pub fn env_find(env: Env, key: String) -> Option { + if env.borrow().data.contains_key(&key) { + Some(env) + } else { + match env.borrow().outer { + Some(ref e) => env_find(e.clone(), key), + None => None, + } + } +} + +pub fn env_set(env: &Env, key: String, val: MalVal) { + env.borrow_mut().data.insert(key, val.clone()); +} + +pub fn env_get(env: Env, key: String) -> MalRet { + match env_find(env, key.clone()) { + Some(e) => { + match e.borrow().data.find_copy(&key) { + Some(v) => Ok(v), + None => Ok(Rc::new(Nil)), + } + }, + None => Ok(Rc::new(Nil)), + } +} + -- cgit v1.2.3