aboutsummaryrefslogtreecommitdiff
path: root/src/sexp
diff options
context:
space:
mode:
authorJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-06 14:15:12 +0300
committerJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-06 14:15:12 +0300
commit23b2028bdce46d02209fc2df70fc5468a8beffa8 (patch)
tree31e7a6fae6d5d01759a84334555f4cd1fa26a038 /src/sexp
parent3d7ebeddc46e89c8e058b3f1805f836339a2f9ae (diff)
downloadmyslip-23b2028bdce46d02209fc2df70fc5468a8beffa8.tar.gz
myslip-23b2028bdce46d02209fc2df70fc5468a8beffa8.zip
Added boilerplate and tests for let-binds
Diffstat (limited to 'src/sexp')
-rw-r--r--src/sexp/display.rs1
-rw-r--r--src/sexp/mod.rs2
-rw-r--r--src/sexp/step.rs30
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 {