X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=sem.icl;h=1bedd621ea984665f0040a52564cd74b7003353f;hb=097dfcba775724fff22039d5895d44ac4d31d5fe;hp=992d660dda8fe1916437f07ff698eeaf9335c7c6;hpb=b2e209f5c3b3d334dde4c93e8e86f4334428e802;p=cc1516.git diff --git a/sem.icl b/sem.icl index 992d660..1bedd62 100644 --- a/sem.icl +++ b/sem.icl @@ -121,21 +121,36 @@ instance unify Expr where unify (IdType _) e = liftT $ Left $ ParseError (extrPos e) "Expression cannot be an polymorf type." unify VarType e = typeExpr e + unify (IdType i) e = undef //we have to cheat to decorate the error, can be done nicer? unify t e = StateT $ \s0 -> let res = runStateT m s0 in case res of Left err = Left $ decErr e err Right t = Right t //note, t :: (Type, Gamma) where m = typeExpr e >>= \tex-> unify t tex - +replace :: String Type -> Env Void +replace ident type = get >>= \(st, fr)->put ('Map'.fromList $ + map (itupdate ident type) ('Map'.toList st), fr) + where + itupdate :: String Type (String, Type) -> (String, Type) + itupdate ident newtype ov=:(key, IdType type) = if (ident == type) + (key, newtype) ov + itupdate ident newtype (key, TupleType (t1, t2)) + # (_, t1) = itupdate ident newtype (key, t1) + # (_, t2) = itupdate ident newtype (key, t2) + = (key, TupleType (t1, t2)) + itupdate ident newtype (key, ListType t1) + # (_, t1) = itupdate ident newtype (key, t1) + = (key, ListType t1) + itupdate _ _ k = k instance unify Type where unify IntType IntType = pure IntType unify BoolType BoolType = pure BoolType unify CharType CharType = pure CharType - //unify t (IdType i) = unify (IdType i) t - //note, don't use putIdent as that will call unify again - //unify (IdType i) e=:(IdType j) = modify (\(st, r)->('Map'.put j e st, r)) + unify (IdType i) t=:(IdType j) = replace i t >>| pure t + unify t (IdType i) = unify (IdType i) t + unify (IdType i) t = replace i t >>| pure t //unify (ListType t1) (ListType t2) = unify t1 t2 unify t1 t2 = liftT $ Left $ UnifyError zero t1 t2