diff options
| author | Joel Martin <github@martintribe.org> | 2014-10-25 13:00:01 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2015-01-06 21:58:57 -0600 |
| commit | 8f5b0f1040de849da3fb5ade645308e7bbe7f025 (patch) | |
| tree | a65a2e2c1db5013338a83af101becf676517ba1d /rust/src/env.rs | |
| parent | 0ab374bc261f871ab8fbbc13e0096f44225e2a3f (diff) | |
| download | mal-8f5b0f1040de849da3fb5ade645308e7bbe7f025.tar.gz mal-8f5b0f1040de849da3fb5ade645308e7bbe7f025.zip | |
Rust: add step3_env
Diffstat (limited to 'rust/src/env.rs')
| -rw-r--r-- | rust/src/env.rs | 44 |
1 files changed, 44 insertions, 0 deletions
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<String,MalVal>, + outer: Option<Env>, +} + +pub type Env = Rc<RefCell<EnvType>>; + +pub fn env_new(outer: Option<Env>) -> Env { + Rc::new(RefCell::new(EnvType{data: HashMap::new(), outer: outer})) +} + +pub fn env_find(env: Env, key: String) -> Option<Env> { + 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)), + } +} + |
