pub mod util; pub mod display; pub mod check; pub mod subst; use crate::sexp::SExp; #[derive(Clone,Debug,PartialEq)] pub enum Type { Integer, Arrow(Box, Box), List(Vec), /// Type for generics /// and also error messages /// with unknown types VarType(String), } #[derive(Debug,PartialEq)] pub enum TypeError { UndefinedVariable(String), UnboundGeneric(String), InvalidOperator { operator: SExp, expected: Type, found: Type, }, InvalidArgList { arglist: SExp, expected: Type, found: Type, }, OtherError } impl Type { /// Tests if the type has no variable types. /// /// **Examples** /// ```rust /// use melisp::r#type::{*, Type::*, TypeError::*, util::*}; /// /// assert!(Integer.is_concrete()); /// assert!(!VarType("a".to_string()).is_concrete()); /// /// assert!(arr(Integer, Integer).is_concrete()); /// assert!(!arr(VarType("b".to_string()), Integer).is_concrete()); /// /// assert!( /// List(vec![Integer, Integer, arr(Integer, Integer)]).is_concrete() /// ); /// assert!( /// !List(vec![Integer, VarType("a".to_string()), Integer]) /// .is_concrete() /// ); /// ``` pub fn is_concrete(&self) -> bool { todo!() } }