From 6897eb128330eaea8e8fb1e6d3d199f214032c8d Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 30 Jul 2015 03:13:49 -0700 Subject: [PATCH] Implemented variable binding --- src/evaluate.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/evaluate.rs b/src/evaluate.rs index 19ce08a..c985977 100644 --- a/src/evaluate.rs +++ b/src/evaluate.rs @@ -3,18 +3,24 @@ use std::collections::HashMap; use parser::AST; use parser::AST::*; -pub struct Environment(pub HashMap); +pub struct Environment(pub HashMap>); type EvalResult = (AST, Environment); impl Environment { pub fn new() -> Environment { Environment(HashMap::new()) } + + fn add_binding(&mut self, name: String, binding: Box) { + match *self { + Environment(ref mut hash_map) => hash_map.insert(name, binding) + }; + } } pub fn evaluate(ast: AST, env: Environment) -> String { - let (reduced_ast, final_env) = reduce((ast, env)); + let (mut reduced_ast, final_env) = reduce((ast, env)); match reduced_ast { DoNothing => "".to_string(), @@ -25,7 +31,7 @@ pub fn evaluate(ast: AST, env: Environment) -> String { } fn reduce(evr: EvalResult) -> EvalResult { - let (ast, env) = evr; + let (mut ast, mut env) = evr; match ast { Statements(stmts) => { @@ -38,6 +44,12 @@ fn reduce(evr: EvalResult) -> EvalResult { } (reduced_ast, reduced_env) }, + + Binding(name, binding) => { + env.add_binding(name, binding); + (DoNothing, env) + }, + other_ast => (other_ast, env) } }