diff options
Diffstat (limited to 'src/sexp/mod.rs')
-rw-r--r-- | src/sexp/mod.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs index 3dbcbb5..f6c50d7 100644 --- a/src/sexp/mod.rs +++ b/src/sexp/mod.rs @@ -17,6 +17,7 @@ pub enum SLeaf { Div, Int(i32), Var(String), + Quote, Nil, } @@ -31,3 +32,23 @@ pub enum SExp { SCons(Box<SExp>, Box<SExp>), 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 + } + } +} |