From 06798d622327707ca3f3b42d65fc3d1a25ae3c57 Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Sun, 10 Aug 2025 18:38:49 +0300 Subject: Added term level type literals (for function type signatures) --- src/type/check.rs | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'src/type/check.rs') diff --git a/src/type/check.rs b/src/type/check.rs index 874db58..24c255d 100644 --- a/src/type/check.rs +++ b/src/type/check.rs @@ -67,8 +67,6 @@ impl SExp { /// sexp::{SExp::*, SLeaf::*, util::*}, /// }; /// - /// assert_eq!(Atom(Add).type_check(), Ok(arr(List(vec![Integer, Integer]), Integer))); - /// assert_eq!(Atom(Mul).type_check(), Ok(arr(List(vec![Integer, Integer]), Integer))); /// assert_eq!(Atom(Sub).type_check(), Ok(arr(List(vec![Integer, Integer]), Integer))); /// assert_eq!(Atom(Div).type_check(), Ok(arr(List(vec![Integer, Integer]), Integer))); /// assert_eq!(Atom(Eq) .type_check(), Ok(arr(List(vec![Integer, Integer]), Boolean))); @@ -112,15 +110,6 @@ impl SExp { /// sexp::{SExp::*, SLeaf::*, util::*}, /// }; /// - /// let err = scons(Mul, scons(1, Nil)).type_check(); - /// match err { - /// Err(InvalidArgList { .. }) => (), - /// _ => panic!( - /// "passing only 1 argument to '*' should result in InvalidArgList error, found '{:?}'", - /// err - /// ), - /// }; - /// /// match scons(Sub, scons(1, scons(2, scons(3, Nil)))).type_check() { /// Err(InvalidArgList { .. }) => (), /// _ => panic!( @@ -178,8 +167,8 @@ impl SExp { Atom(Var(name)) => ctx.get(name) .ok_or(UndefinedVariable(name.to_string())) .cloned(), - Atom(Add) => Ok(arr(List(vec![Integer, Integer]), Integer)), // TODO varlen - Atom(Mul) => Ok(arr(List(vec![Integer, Integer]), Integer)), // TODO varlen + Atom(Add) => Ok(arr(vecof(Integer), Integer)), + Atom(Mul) => Ok(arr(vecof(Integer), Integer)), Atom(Sub) => Ok(arr(List(vec![Integer, Integer]), Integer)), Atom(Div) => Ok(arr(List(vec![Integer, Integer]), Integer)), Atom(Eq | Neq | Lt | Gt | Le | Ge) => @@ -197,7 +186,8 @@ impl SExp { )), Atom(Let) => Ok(LetType), Atom(Print) => Ok(arr(vt("_"), List(vec![]))), - + Atom(Ty(_)) => Ok(TypeLit), + Atom(Arr) => Ok(arr(List(vec![TypeLit, TypeLit]), TypeLit)), SCons(op, l) => { @@ -218,6 +208,10 @@ impl SExp { let opertype = (*op).infer_type(ctx.clone())?; let argstype = (*l).infer_list_type(ctx)?; + if opertype == TypeLit && argstype.aka(&vecof(TypeLit)) { + return Ok(TypeLit); + } + let conv_args = match (opertype.clone(), argstype.clone()) { (Arrow(from, _), a) => match a.clone().into_type(&*from) { Ok(s) => Ok(s), -- cgit v1.2.3