shithub: MicroHs

Download patch

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
--