State for eval

This commit is contained in:
greg 2017-12-03 22:10:19 -08:00
parent bcd70ff538
commit 2bb55b6cca
1 changed files with 21 additions and 13 deletions

View File

@ -4,10 +4,14 @@ use std::iter::Peekable;
use std::vec::IntoIter; use std::vec::IntoIter;
use std::str::Chars; use std::str::Chars;
pub struct Rukka { } pub struct EvaluatorState { }
pub struct Rukka {
state: EvaluatorState
}
impl Rukka { impl Rukka {
pub fn new() -> Rukka { Rukka { } } pub fn new() -> Rukka { Rukka { state: EvaluatorState::new() } }
} }
impl ProgrammingLanguageInterface for Rukka { impl ProgrammingLanguageInterface for Rukka {
@ -30,7 +34,7 @@ impl ProgrammingLanguageInterface for Rukka {
}; };
let output_str: String = sexps.into_iter().enumerate().map(|(i, sexp)| { let output_str: String = sexps.into_iter().enumerate().map(|(i, sexp)| {
match eval(sexp) { match self.state.eval(sexp) {
Ok(result) => format!("{}: {}", i, result.print()), Ok(result) => format!("{}: {}", i, result.print()),
Err(err) => format!("{} Error: {}", i, err), Err(err) => format!("{} Error: {}", i, err),
} }
@ -40,16 +44,20 @@ impl ProgrammingLanguageInterface for Rukka {
} }
} }
fn eval(expr: Sexp) -> Result<Sexp, String> {
use self::Sexp::*; use self::AtomT::*; impl EvaluatorState {
Ok(match expr { fn new() -> EvaluatorState { EvaluatorState { } }
Atom(atom) => match atom { fn eval(&mut self, expr: Sexp) -> Result<Sexp, String> {
Symbol(s) => Atom(Symbol(s)), use self::Sexp::*; use self::AtomT::*;
LangString(s) => Atom(LangString(s)), Ok(match expr {
Number(s) => Atom(Number(s)), Atom(atom) => match atom {
}, Symbol(s) => Atom(Symbol(s)),
List(items) => unimplemented!(), LangString(s) => Atom(LangString(s)),
}) Number(s) => Atom(Number(s)),
},
List(items) => unimplemented!(),
})
}
} }
fn read(input: &str) -> Result<Vec<Sexp>, String> { fn read(input: &str) -> Result<Vec<Sexp>, String> {