typeCheckExp (ENot e) = do
TBool <- typeCheckExp e
return TBool
+typeCheckExp (EFunc i as) = do
+ state <- get
+ (t,ts) <- lookup i $ functions state
+ checkParams as ts
+ return t
+
+checkParams :: (MonadState State m) => [Exp] -> [Type] -> m ()
+checkParams [] [] = return ()
+checkParams [] _ = fail "Too for arguments when calling function"
+checkParams _ [] = fail "Too many arguments when calling function"
+checkParams (e:es) (t:ts) = do
+ t2 <- typeCheckExp e
+ assert (t == t2) "Arugments does not match"
+ checkParams es ts
typeCheckVar :: (MonadState State m) => Ident -> m Type
typeCheckVar i = do