aboutsummaryrefslogtreecommitdiff
path: root/rust/src/env.rs
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-10-25 13:00:01 -0500
committerJoel Martin <github@martintribe.org>2015-01-06 21:58:57 -0600
commit8f5b0f1040de849da3fb5ade645308e7bbe7f025 (patch)
treea65a2e2c1db5013338a83af101becf676517ba1d /rust/src/env.rs
parent0ab374bc261f871ab8fbbc13e0096f44225e2a3f (diff)
downloadmal-8f5b0f1040de849da3fb5ade645308e7bbe7f025.tar.gz
mal-8f5b0f1040de849da3fb5ade645308e7bbe7f025.zip
Rust: add step3_env
Diffstat (limited to 'rust/src/env.rs')
-rw-r--r--rust/src/env.rs44
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)),
+ }
+}
+