use std::fmt; use number::LispNumber; mod error; mod lex; mod number; #[derive(Debug, PartialEq)] pub enum LispExpr { Number(LispNumber), List(Vec), StringLit(String), BoolLit(bool), Ident(String), Function(LispFunction), } impl fmt::Display for LispExpr { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { LispExpr::Number(n) => write!(f, "{}", n)?, LispExpr::List(l) => { for expr in l.iter() { write!(f, " {} ", expr)? } } LispExpr::StringLit(s) => write!(f, "{:?}", s)?, LispExpr::BoolLit(b) => { if *b { write!(f, "#t")? } else { write!(f, "#f")? } } LispExpr::Ident(s) => write!(f, "{}", s)?, LispExpr::Function(_) => write!(f, "<#procedure>")?, }; Ok(()) } } pub type Environment = Vec<(String, LispExpr)>; #[derive(Debug, PartialEq)] struct LispFunction {}