Work on interpreter
This commit is contained in:
34
src/interpreter.rs
Normal file
34
src/interpreter.rs
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user