aboutsummaryrefslogtreecommitdiff
path: root/src/type/check.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/type/check.rs')
-rw-r--r--src/type/check.rs22
1 files changed, 8 insertions, 14 deletions
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),