diff options
author | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-08-14 18:48:43 +0300 |
---|---|---|
committer | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-08-14 18:48:43 +0300 |
commit | f057211407df29c772ac18303f13d5564684979d (patch) | |
tree | 2bbca39327156317a1fb0152889c469523b93d88 | |
parent | c411c568d60246cd995ebf6880f4143e458b605f (diff) | |
download | myslip-f057211407df29c772ac18303f13d5564684979d.tar.gz myslip-f057211407df29c772ac18303f13d5564684979d.zip |
feat: statics for fixed point recursion
-rw-r--r-- | src/parse/parsetree.rs | 1 | ||||
-rw-r--r-- | src/sexp/display.rs | 1 | ||||
-rw-r--r-- | src/sexp/mod.rs | 2 | ||||
-rw-r--r-- | src/type/check.rs | 1 |
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), |