pub mod step; pub mod util; pub mod subst; /// A leaf node for S-Expressions. /// /// May represent built-in operators, /// variables, functions (to be added) or values. #[derive(Debug)] #[derive(PartialEq)] #[derive(Clone)] pub enum SLeaf { Add, Sub, Mul, Div, Int(i32), Var(String), Quote, Nil, } /// An S-Expression; the defining structure of the language. /// /// This structure is not intended to correspond with /// IETF-standardized s-expressions; they are only inspiration. #[derive(Debug)] #[derive(PartialEq)] #[derive(Clone)] pub enum SExp { SCons(Box, Box), Atom(SLeaf), } use SExp::*; use SLeaf::*; impl SExp { pub fn is_value(&self) -> bool { match self { SCons(a, _) => **a == Atom(Quote), Atom(Var(_)) => false, Atom(_) => true, } } pub fn consists_of_values(&self) -> bool { self.is_value() || match self { SCons(a, b) if (*a).is_value() => b.consists_of_values(), _ => false } } }