State type manipulations

This commit is contained in:
greg 2018-05-11 01:56:12 -07:00
parent 67917612e6
commit bd1eed884f
2 changed files with 20 additions and 11 deletions

View File

@ -4,14 +4,20 @@ use std::fmt::Write;
use itertools::Itertools; use itertools::Itertools;
use parsing::{AST, Statement, Declaration, Expression, Variant, ExpressionType}; use util::StateStack;
use ast_reducing::{ReducedAST, Stmt, Expr, Lit, Func}; use ast_reducing::{ReducedAST, Stmt, Expr, Lit, Func};
use builtin::{BinOp, PrefixOp}; use builtin::{BinOp, PrefixOp};
pub struct State<'a> { pub struct State<'a> {
parent_frame: Option<&'a State<'a>>, values: StateStack<'a, Rc<String>, ValueEntry>
values: HashMap<Rc<String>, ValueEntry>,
} }
impl<'a> State<'a> {
pub fn new() -> State<'a> {
State { values: StateStack::new(Some(format!("global"))) }
}
}
/* /*
impl<'a> State<'a> { impl<'a> State<'a> {
@ -32,16 +38,19 @@ impl<'a> State<'a> {
#[derive(Debug)] #[derive(Debug)]
enum ValueEntry { enum ValueEntry {
Binding { Binding {
val: FullyEvaluatedExpr, val: /*FullyEvaluatedExpr*/ Expr,
}, },
/*
Function { Function {
param_names: Vec<Rc<String>>, param_names: Vec<Rc<String>>,
body: Vec<Statement>, body: Vec<Statement>,
} }
*/
} }
type EvalResult<T> = Result<T, String>; type EvalResult<T> = Result<T, String>;
/*
#[derive(Debug, PartialEq, Clone)] #[derive(Debug, PartialEq, Clone)]
enum FullyEvaluatedExpr { enum FullyEvaluatedExpr {
UnsignedInt(u64), UnsignedInt(u64),
@ -57,7 +66,6 @@ enum FullyEvaluatedExpr {
List(Vec<FullyEvaluatedExpr>) List(Vec<FullyEvaluatedExpr>)
} }
/*
impl FullyEvaluatedExpr { impl FullyEvaluatedExpr {
fn to_string(&self) -> String { fn to_string(&self) -> String {
use self::FullyEvaluatedExpr::*; use self::FullyEvaluatedExpr::*;
@ -98,12 +106,6 @@ impl FullyEvaluatedExpr {
} }
*/ */
impl<'a> State<'a> {
pub fn new() -> State<'a> {
State { parent_frame: None, values: HashMap::new() }
}
}
/* /*
pub fn new_with_parent(parent: &'a State<'a>) -> State<'a> { pub fn new_with_parent(parent: &'a State<'a>) -> State<'a> {

View File

@ -10,6 +10,13 @@ pub struct StateStack<'a, T: 'a, V: 'a> where T: Hash + Eq {
} }
impl<'a, T, V> StateStack<'a, T, V> where T: Hash + Eq { impl<'a, T, V> StateStack<'a, T, V> where T: Hash + Eq {
pub fn new(name: Option<String>) -> StateStack<'a, T, V> where T: Hash + Eq {
StateStack {
parent: None,
values: HashMap::new(),
scope_name: name
}
}
pub fn insert(&mut self, key: T, value: V) where T: Hash + Eq { pub fn insert(&mut self, key: T, value: V) where T: Hash + Eq {
self.values.insert(key, value); self.values.insert(key, value);
} }