lisp-rs 2.0.2

Lisp interpreter in Rust
Documentation
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(())
}