aboutsummaryrefslogtreecommitdiff
path: root/src/sexp/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sexp/mod.rs')
-rw-r--r--src/sexp/mod.rs21
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
+ }
+ }
+}