diff options
Diffstat (limited to 'src/sexp')
-rw-r--r-- | src/sexp/display.rs | 1 | ||||
-rw-r--r-- | src/sexp/mod.rs | 2 | ||||
-rw-r--r-- | src/sexp/step.rs | 30 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/sexp/display.rs b/src/sexp/display.rs index 57d1b50..c3db144 100644 --- a/src/sexp/display.rs +++ b/src/sexp/display.rs @@ -27,6 +27,7 @@ impl fmt::Display for SLeaf { Var(s) => s.to_string(), Quote => "quote".to_string(), Vector => "vector".to_string(), + Let => "let".to_string(), Nil => "()".to_string(), }) } diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs index 07d8373..4e3c11c 100644 --- a/src/sexp/mod.rs +++ b/src/sexp/mod.rs @@ -31,6 +31,8 @@ pub enum SLeaf { Quote, Vector, + Let, + Int(i32), True, False, diff --git a/src/sexp/step.rs b/src/sexp/step.rs index 535b183..e031fca 100644 --- a/src/sexp/step.rs +++ b/src/sexp/step.rs @@ -237,6 +237,36 @@ impl SExp { /// scons(2, Nil))).step(), /// Ok(scons(Vector, scons(1, scons(2, Nil)))) /// ); + /// ``` + /// + /// **Let-bindings** + /// ```rust + /// use myslip::sexp::{SExp::*, SLeaf::*, util::*}; + /// + /// assert_eq!( + /// scons( + /// scons(Let, scons(var("x"), scons(5, Nil))), scons( + /// scons(Add, scons(var("x"), scons(1, Nil))), Nil + /// ) + /// ).step(), + /// Ok(scons(Add, scons(5, scons(1, Nil)))) + /// ); + /// assert_eq!( + /// scons( + /// scons(Let, scons(var("y"), scons(4, Nil))), + /// scons( + /// scons(Let, scons(var("x"), scons(5, Nil))), + /// scons(scons(Add, scons(var("x"), scons(var("y"), Nil))), Nil) + /// ) + /// ).step(), + /// Ok(scons( + /// scons(Let, scons(var("x"), scons(5, Nil))), scons( + /// scons(Add, scons(var("x"), scons(1, Nil))), Nil + /// ) + /// )) + /// ); + /// ``` + /// pub fn step(self) -> Result<Self, String> { match self { |