mod env;
mod eval;
mod lexer;
mod object;
mod parser;
use linefeed::{Interface, ReadResult};
use object::Object;
use std::cell::RefCell;
use std::rc::Rc;
const PROMPT: &str = "lisp-rs> ";
fn main() -> Result<(), Box<dyn std::error::Error>> {
let reader = Interface::new(PROMPT).unwrap();
let mut env = Rc::new(RefCell::new(env::Env::new()));
reader
.set_prompt(format!("{}", PROMPT).as_ref())
.unwrap();
while let ReadResult::Input(input) =
reader.read_line().unwrap()
{
if input.eq("exit") {
break;
}
let val = eval::eval(input.as_ref(), &mut env)?;
match val {
Object::Void => {}
Object::Integer(n) => println!("{}", n),
Object::Bool(b) => println!("{}", b),
Object::Symbol(s) => println!("{}", s),
Object::Lambda(params, body, _) => {
println!("Lambda(");
for param in params {
println!("{} ", param);
}
println!(")");
for expr in (*body).iter() {
println!(" {}", expr);
}
}
_ => println!("{}", val),
}
}
println!("Good bye");
Ok(())
}