ref: 8c4dce898adb8be8ca462ed6886bac3263b62180
parent: 49dc0463529bf55dafad70477180bf88d879ba14
author: Lennart Augustsson <lennart@augustsson.net>
date: Tue Oct 10 13:23:32 EDT 2023
Check for multiple definitions in EBinds
--- a/src/MicroHs/Expr.hs
+++ b/src/MicroHs/Expr.hs
@@ -8,7 +8,7 @@
Expr(..), showExpr,
Listish(..),
Lit(..), showLit, eqLit,
- EBind(..),
+ EBind(..), showEBind,
Eqn(..),
EStmt(..),
EAlts(..),
--- a/src/MicroHs/Parse.hs
+++ b/src/MicroHs/Parse.hs
@@ -380,9 +380,14 @@
pEqns :: P (Ident, [Eqn])
pEqns = P.do
- (name, eqn@(Eqn ps _)) <- pEqn (\ _ _ -> True)
- neqns <- emany (pSpec ';' *> pEqn (\ n l -> eqIdent n name && l == length ps))
- P.pure (name, eqn : map snd neqns)
+ (name, eqn@(Eqn ps alts)) <- pEqn (\ _ _ -> True)
+ case (ps, alts) of
+ ([], EAlts [_] []) ->
+ -- don't collect equations when of the form 'i = e'
+ P.pure (name, [eqn])
+ _ -> P.do
+ neqns <- emany (pSpec ';' *> pEqn (\ n l -> eqIdent n name && l == length ps))
+ P.pure (name, eqn : map snd neqns)
pEqn :: (Ident -> Int -> Bool) -> P (Ident, Eqn)
pEqn test = P.do
--- a/src/MicroHs/TypeCheck.hs
+++ b/src/MicroHs/TypeCheck.hs
@@ -1183,8 +1183,7 @@
tCheckPat t ap ta = T.do
-- traceM $ "tcPat: " ++ show ap
let vs = filter (not . isUnderscore) $ patVars ap
- T.when (anySameBy eqIdent vs) $
- tcError (getSLocIdent (head vs)) "Multiply defined"
+ multCheck vs
env <- T.mapM (\ v -> (v,) <$> newUVar) vs
withExtVals env $ T.do
pp <- withTCMode TCPat $ tCheckExpr t ap
@@ -1191,6 +1190,12 @@
() <- checkArity 0 pp
ta pp
+multCheck :: [Ident] -> T ()
+multCheck vs =
+ T.when (anySameBy eqIdent vs) $ T.do
+ let v = head vs
+ tcError (getSLocIdent v) $ "Multiply defined: " ++ showIdent v
+
checkArity :: Int -> EPat -> T ()
checkArity n (EApp f a) = T.do
checkArity (n+1) f
@@ -1222,6 +1227,7 @@
let
tmap = M.fromList [ (i, t) | BSign i t <- xbs ]
xs = concatMap getBindVars xbs
+ multCheck xs
xts <- T.mapM (tcBindVarT tmap) xs
withExtVals xts $ T.do
nbs <- T.mapM tcBind xbs
--
⑨