aboutsummaryrefslogtreecommitdiff
path: root/src/sexp
diff options
context:
space:
mode:
authorJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-10 19:16:51 +0300
committerJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-10 19:16:51 +0300
commitd6d1ec80ffcc0b13234b170a91b920371078a027 (patch)
treea8347b04ad354e3f2cb265b5d506a4891853cf7f /src/sexp
parent06798d622327707ca3f3b42d65fc3d1a25ae3c57 (diff)
downloadmyslip-d6d1ec80ffcc0b13234b170a91b920371078a027.tar.gz
myslip-d6d1ec80ffcc0b13234b170a91b920371078a027.zip
Added tests for functions
Diffstat (limited to 'src/sexp')
-rw-r--r--src/sexp/display.rs1
-rw-r--r--src/sexp/mod.rs10
-rw-r--r--src/sexp/step.rs16
3 files changed, 27 insertions, 0 deletions
diff --git a/src/sexp/display.rs b/src/sexp/display.rs
index 5d78e93..eff3904 100644
--- a/src/sexp/display.rs
+++ b/src/sexp/display.rs
@@ -29,6 +29,7 @@ impl fmt::Display for SLeaf {
Vector => "vector".to_string(),
Print => "print".to_string(),
Let => "let".to_string(),
+ Fun => "fn".to_string(),
Ty(t) => t.to_string(),
Arr => "->".to_string(),
Nil => "()".to_string(),
diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs
index 11c185f..4bb4fa2 100644
--- a/src/sexp/mod.rs
+++ b/src/sexp/mod.rs
@@ -35,6 +35,8 @@ pub enum SLeaf {
Let,
+ Fun,
+
Ty(Type),
Arr,
@@ -75,6 +77,7 @@ impl SExp {
pub fn is_value(&self) -> bool {
match self {
SCons(a, b) =>
+ scons(a.clone(), b.clone()).is_fun() ||
SCons(a.clone(), b.clone()).check_let().is_some() ||
(
(**a == Atom(Quote) || **a == Atom(Vector) || (**a).is_type_lit())
@@ -102,4 +105,11 @@ impl SExp {
_ => false
}
}
+
+ pub fn is_fun(&self) -> bool {
+ match self {
+ SCons(a, _) if **a == Atom(Fun) => true,
+ _ => false
+ }
+ }
}
diff --git a/src/sexp/step.rs b/src/sexp/step.rs
index c26dce9..8cc1e64 100644
--- a/src/sexp/step.rs
+++ b/src/sexp/step.rs
@@ -270,6 +270,22 @@ impl SExp {
/// );
/// ```
///
+ /// **Functions**
+ /// ```rust
+ /// use myslip::{sexp::{SExp::*, SLeaf::*, util::*}, r#type::{Type::*, util::*}};
+ ///
+ /// let varlist = scons(var("a"), scons(var("b"), Nil));
+ /// let typelist = scons(Ty(List(vec![Integer])), Nil);
+ /// let ret = Atom(Ty(Boolean));
+ /// let body = scons(Gt, varlist.clone());
+ /// let fun = scons(Fun, scons(varlist, scons(typelist, scons(ret, scons(body, Nil)))));
+ /// let args = scons(2, scons(1, Nil));
+ /// assert_eq!(
+ /// scons(fun, scons(args, Nil)).multistep(),
+ /// Ok(Atom(True))
+ /// );
+ /// ```
+ ///
/// Shadowing:
/// ```rust
/// use myslip::sexp::{SExp::*, SLeaf::*, util::*};