Work on interpreter

This commit is contained in:
2021-05-20 14:11:32 -04:00
parent 65444afe14
commit f4c58cfa02
3 changed files with 42 additions and 2 deletions

34
src/interpreter.rs Normal file
View File

@@ -0,0 +1,34 @@
use crate::parser::Datum;
use crate::parser::Datum::*;
fn add(args: Vec<Datum>) -> Datum {
Number(42)
}
fn lookup_variable_value(exp: Datum) -> Datum {
if let Symbol(string) = exp {
match string.as_str() {
"+" => Procedure(add),
_ => panic!("unbound-variable {:?}", string)
}
} else {
panic!("LOOKUP-VARIABLE-VALUE -- not-a-symbol {:?}", exp)
}
}
fn application(exp: Datum) -> Datum {
if let List(vector) = exp {
vector[0]
} else {
panic!("APPLICATION -- cannot-apply {:?}", exp)
}
}
pub fn interpret(exp: Datum) -> Datum {
match exp {
Boolean(_) | Number(_) => exp,
Symbol(_) => lookup_variable_value(exp),
List(_) => application(exp),
_ => panic!("unknown-expression {:?}", exp)
}
}

View File

@@ -1,9 +1,13 @@
mod lexer; mod lexer;
mod parser; mod parser;
mod interpreter;
fn main() { fn main() {
let scm_code = "(+ a (* 32 b) c #t #f)"; // let scm_code = "(+ a (* 32 b) c #t #f)";
let scm_code = "+";
let tokens = lexer::read(scm_code); let tokens = lexer::read(scm_code);
let datum = parser::parse(tokens); let datum = parser::parse(tokens);
println!("{:?}", datum); let result = interpreter::interpret(datum);
println!("{:?}", result);
} }

View File

@@ -2,12 +2,14 @@ use crate::lexer::Token;
use crate::lexer::Tokens; use crate::lexer::Tokens;
#[derive(Debug)] #[derive(Debug)]
pub enum Datum { pub enum Datum {
Boolean(bool), Boolean(bool),
Number(i64), Number(i64),
Symbol(String), Symbol(String),
List(Vec<Datum>), List(Vec<Datum>),
Procedure(fn(Vec<Datum>) -> Datum),
} }
pub fn parse(tokens: Tokens) -> Datum { pub fn parse(tokens: Tokens) -> Datum {