aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-14 18:48:43 +0300
committerJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-14 18:48:43 +0300
commitf057211407df29c772ac18303f13d5564684979d (patch)
tree2bbca39327156317a1fb0152889c469523b93d88
parentc411c568d60246cd995ebf6880f4143e458b605f (diff)
downloadmyslip-f057211407df29c772ac18303f13d5564684979d.tar.gz
myslip-f057211407df29c772ac18303f13d5564684979d.zip
feat: statics for fixed point recursion
-rw-r--r--src/parse/parsetree.rs1
-rw-r--r--src/sexp/display.rs1
-rw-r--r--src/sexp/mod.rs2
-rw-r--r--src/type/check.rs1
4 files changed, 5 insertions, 0 deletions
diff --git a/src/parse/parsetree.rs b/src/parse/parsetree.rs
index 86da0f0..bd15e79 100644
--- a/src/parse/parsetree.rs
+++ b/src/parse/parsetree.rs
@@ -123,6 +123,7 @@ fn tokens_to_ast_inner(
Some(Sym(s)) if s == "let" => Ok(Atom(Let)),
Some(Sym(s)) if s == "fn" => Ok(Atom(Fun)),
Some(Sym(s)) if s == "case" => Ok(Atom(Case)),
+ Some(Sym(s)) if s == "fix" => Ok(Atom(Fix)),
Some(Sym(s)) if s.starts_with("..") =>
Ok(Atom(RestPat(s.strip_prefix("..").unwrap().to_string()))),
Some(Sym(s)) => Ok(Atom(Var(s))),
diff --git a/src/sexp/display.rs b/src/sexp/display.rs
index ceab833..e2f4ffc 100644
--- a/src/sexp/display.rs
+++ b/src/sexp/display.rs
@@ -31,6 +31,7 @@ impl fmt::Display for SLeaf {
Print => "print".to_string(),
Let => "let".to_string(),
Fun => "fn".to_string(),
+ Fix => "fix".to_string(),
Case => "case".to_string(),
Ty(t) => t.to_string(),
Nil => "()".to_string(),
diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs
index eeeb2d6..aa51811 100644
--- a/src/sexp/mod.rs
+++ b/src/sexp/mod.rs
@@ -38,6 +38,8 @@ pub enum SLeaf {
Fun,
+ Fix,
+
Case,
Ty(Type),
diff --git a/src/type/check.rs b/src/type/check.rs
index effdc0a..d118871 100644
--- a/src/type/check.rs
+++ b/src/type/check.rs
@@ -257,6 +257,7 @@ impl SExp {
Atom(Print) => Ok(arr(vt("_"), List(vec![]))),
Atom(Ty(_)) => Ok(TypeLit),
Atom(Fun) => Err(FunAsAtom),
+ Atom(Fix) => Ok(arr(arr(vt("T"), vt("T")), vt("T"))),
Atom(Case) => Err(CaseAsAtom),
Atom(RestPat(_)) => Err(RestAsAtom),