use std::rc::Rc; use crate::util::unescape; #[derive(Debug, Clone)] pub enum Type { Null, Bool(bool), Number(i64), Str(String), Symbol(String), List(Rc>, Rc), Vector(Rc>, Rc), // Function(fn(Arguments) -> Return, Rc), } impl std::fmt::Display for Type { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Type::Null => write!(f, "Null"), Type::Bool(b) => write!(f, "{}", b), Type::Number(n) => write!(f, "{}", n), Type::Str(s) => write!(f, "\"{}\"", unescape(s.to_string())), Type::Symbol(s) => write!(f, "{}", s), Type::List(l, _) => write!(f, "({})", l.iter().map(|e| format!("{}", e)).collect::>().join(" ")), Type::Vector(l, _) => write!(f, "[{}]", l.iter().map(|e| format!("{}", e)).collect::>().join(", ")), // Type::Function(func, _) => write!(f, "<{:?}>", func), } } } #[derive(Debug)] pub enum Error { ErrorString(String), } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Error::ErrorString(s) => write!(f, "{}", s), } } } // pub type Arguments = Vec; pub type Return = Result; #[macro_export] macro_rules! list { ($seq:expr) => {{ List(Rc::new($seq),Rc::new(Null)) }}; [$($args:expr),*] => {{ let v: Vec = vec![$($args),*]; List(Rc::new(v),Rc::new(Null)) }} } #[macro_export] macro_rules! vector { ($seq:expr) => {{ Vector(Rc::new($seq), Rc::new(Null)) }}; [$($args:expr),*] => {{ let v: Vec = vec![$($args),*]; Vector(Rc::new(v), Rc::new(Null)) }} }