@@ -1205,7 +1205,7 @@ addUsingConstraints syn fc t
12051205 | otherwise = doAdd cs ns t
12061206
12071207 mkConst c args = PApp fc (PRef fc c)
1208− (map (\n -> PExp 0 [] (sMN 0 "carg" (PRef fc n)) args)
1208+ (map (\n -> PExp 0 [] (sMN 0 "carg") (PRef fc n)) args)
12091209
12101210 getConstraints (PPi (Constraint _ _) _ c sc)
12111211 = getcapp c ++ getConstraints sc
@@ -1232,8 +1232,7 @@ implicit' :: ElabInfo -> SyntaxInfo -> [Name] -> Name -> PTerm -> Idris PTerm
12321232implicit' info syn ignore n ptm
12331233 = do i <- getIState
12341234 let (tm', impdata) = implicitise syn ignore i ptm
1235− -- TODO WIP check impdata for unknown vars in default args
1236− defaultArgCheck (eInfoNames info ++ keys (idris_implicits i)) impdata
1235+ defaultArgCheck (eInfoNames info ++ M.keys (idris_implicits i)) impdata
12371236-- let (tm'', spos) = findStatics i tm'
12381237 putIState $ i { idris_implicits = addDef n impdata (idris_implicits i) }
12391238 addIBC (IBCImp n)
@@ -1244,21 +1243,20 @@ implicit' info syn ignore n ptm
12441243 where
12451244 -- Detect unknown names in default arguments and throw error if found.
12461245 defaultArgCheck :: [Name] -> [PArg] -> Idris ()
1247− defaultArgCheck names params = foldM_ names params unknownInDefault
1248−
1249− unknownInDefault :: [Name] -> PArg -> Idris [Name]
1250− unknownInDefault ns (PTacImplicit _ _ n script _)
1251− = case notFound (namesIn script) ns of
1252− Nothing -> return (n:ns)
1253− Just name -> throwError (NoSuchVariable name)
1254− -- TODO See if PConstraint in addition to PExp can reasonably have
1255− -- a name. Until then, 'pname p' worksn't.
1256− unknownInDefault ns p = return (pname p):ns
1257−
1258− unknown :: [Name] -> [Name] -> Maybe Name
1259− unknown [] _ = Nothing
1260− unknown (SN (WhereN _ _ _)):as bs = unknown as bs
1261− unknown a:as bs = if elem a bs then unknown as bs else Just a
1246+ defaultArgCheck knowns params = foldM_ notFoundInDefault knowns params
1247+
1248+ notFoundInDefault :: [Name] -> PArg -> Idris [Name]
1249+ notFoundInDefault kns (PTacImplicit _ _ n script _)
1250+ = do i <- getIState
1251+ case notFound kns (namesIn [] i script) of
1252+ Nothing -> return (n:kns)
1253+ Just name -> throwError (NoSuchVariable name)
1254+ notFoundInDefault kns p = return ((pname p):kns)
1255+
1256+ notFound :: [Name] -> [Name] -> Maybe Name
1257+ notFound kns [] = Nothing
1258+ notFound kns (SN (WhereN _ _ _) : ns) = notFound kns ns -- Known already
1259+ notFound kns (n:ns) = if elem n kns then notFound kns ns else Just n
12621260
12631261implicitise :: SyntaxInfo -> [Name] -> IState -> PTerm -> (PTerm, [PArg])
12641262implicitise syn ignore ist tm = -- trace ("INCOMING " ++ showImp True tm) $
@@ -1525,6 +1523,9 @@ aiFn inpat expat ist fc f ds as
15251523 [(n,t)] -> t
15261524 _ -> Public
15271525
1526+ insertImpl :: [PArg] -> [PArg] -> [PArg]
1527+ insertImpl ps as = insImpAcc M.empty ps as
1528+
15281529 -- TODO WIP substitution into default arg expressions.
15291530 -- - An extra accumulator parameter here?
15301531 -- - Accumulator of what?
@@ -1534,38 +1535,38 @@ aiFn inpat expat ist fc f ds as
15341535 -- function?
15351536 -- - Check for existing call sites of insertImpl.
15361537 -- - Well, easy: this is in a where block :-).
1537− insertImpl :: M.Map Name PTerm -- accumulated param names & arg terms
1538− -> [PArg] -- parameters
1539− -> [PArg] -- arguments
1540− -> [PArg]
1541− insertImpl pnas (PExp p l n ty : ps) (PExp _ _ _ tm : given) =
1542− PExp p l n tm : insertImpl (M.insert n tm pnas) ps given
1543− insertImpl pnas (PConstraint p l n ty : ps) (PConstraint _ _ _ tm : given) =
1544− PConstraint p l n tm : insertImpl (M.insert n tm pnas) ps given
1545− insertImpl pnas (PConstraint p l n ty : ps) given =
1538+ insImpAcc :: M.Map Name PTerm -- accumulated param names & arg terms
1539+ -> [PArg] -- parameters
1540+ -> [PArg] -- arguments
1541+ -> [PArg]
1542+ insImpAcc pnas (PExp p l n ty : ps) (PExp _ _ _ tm : given) =
1543+ PExp p l n tm : insImpAcc (M.insert n tm pnas) ps given
1544+ insImpAcc pnas (PConstraint p l n ty : ps) (PConstraint _ _ _ tm : given) =
1545+ PConstraint p l n tm : insImpAcc (M.insert n tm pnas) ps given
1546+ insImpAcc pnas (PConstraint p l n ty : ps) given =
15461547 let rtc = PResolveTC fc in
1547− PConstraint p l n rtc : insertImpl (M.insert n rtc pnas) ps given
1548− insertImpl pnas (PImp p _ l n ty : ps) given =
1548+ PConstraint p l n rtc : insImpAcc (M.insert n rtc pnas) ps given
1549+ insImpAcc pnas (PImp p _ l n ty : ps) given =
15491550 case find n given [] of
15501551 Just (tm, given') ->
1551− PImp p False l n tm : insertImpl (M.insert n tm pnas) ps given'
1552+ PImp p False l n tm : insImpAcc (M.insert n tm pnas) ps given'
15521553 Nothing ->
15531554 PImp p True l n Placeholder :
1554− insertImpl (M.insert n Placeholder pnas) ps given
1555− insertImpl pnas (PTacImplicit p l n sc' ty : ps) given =
1556− let sc = addImpl ist (substMatches (toList pnas) sc') in
1555+ insImpAcc (M.insert n Placeholder pnas) ps given
1556+ insImpAcc pnas (PTacImplicit p l n sc' ty : ps) given =
1557+ let sc = addImpl ist (substMatches (M.toList pnas) sc') in
15571558 case find n given [] of
15581559 Just (tm, given') ->
15591560 PTacImplicit p l n sc tm :
1560− insertImpl (M.insert n tm pnas) ps given'
1561+ insImpAcc (M.insert n tm pnas) ps given'
15611562 Nothing ->
15621563 if inpat
15631564 then PTacImplicit p l n sc Placeholder :
1564− insertImpl (M.insert n Placeholder pnas) ps given
1565+ insImpAcc (M.insert n Placeholder pnas) ps given
15651566 else PTacImplicit p l n sc sc :
1566− insertImpl (M.insert n sc pnas) ps given
1567− insertImpl expected [] = []
1568− insertImpl _ given = given
1567+ insImpAcc (M.insert n sc pnas) ps given
1568+ insImpAcc _ expected [] = []
1569+ insImpAcc _ _ given = given
15691570
15701571 find n [] acc = Nothing
15711572 find n (PImp _ _ _ n' t : gs) acc
@@ -1602,8 +1603,8 @@ stripLinear i tm = evalState (sl tm) [] where
16021603 return $ PApp fc fn args'
16031604 where slA (PImp p m l n t) = do t' <- sl t
16041605 return $ PImp p m l n t'
1605− slA (PExp p l n t) = do t' <- sl t
1606− return $ PExp p l n t'
1606+ slA (PExp p l n t) = do t' <- sl t
1607+ return $ PExp p l n t'
16071608 slA (PConstraint p l n t)
16081609 = do t' <- sl t
16091610 return $ PConstraint p l n t'