From f057211407df29c772ac18303f13d5564684979d Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Thu, 14 Aug 2025 18:48:43 +0300 Subject: feat: statics for fixed point recursion --- src/parse/parsetree.rs | 1 + src/sexp/display.rs | 1 + src/sexp/mod.rs | 2 ++ src/type/check.rs | 1 + 4 files changed, 5 insertions(+) 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), -- cgit v1.2.3