@@ -15,7 +15,7 @@ import Idris.Core.Elaborate hiding (Tactic(..))
15import Idris.Core.TT
15import Idris.Core.TT
16import Idris.Core.Evaluate
16import Idris.Core.Evaluate
17import Idris.Core.Unify
17import Idris.Core.Unify
18−import Idris.Core.Typecheck (check, recheck)
18+import Idris.Core.Typecheck (check, recheck, isType)
19import Idris.Coverage (buildSCG, checkDeclTotality, genClauses, recoverableCoverage, validCoverageCase)
19import Idris.Coverage (buildSCG, checkDeclTotality, genClauses, recoverableCoverage, validCoverageCase)
20import Idris.ErrReverse (errReverse)
20import Idris.ErrReverse (errReverse)
21import Idris.ElabQuasiquote (extractUnquotes)
21import Idris.ElabQuasiquote (extractUnquotes)
@@ -1100,7 +1100,9 @@ elab ist info emode opts fn tm
1100 do attack
1100 do attack
1101 n <- getNameFrom (sMN 0 "tacticScript")
1101 n <- getNameFrom (sMN 0 "tacticScript")
1102 n' <- getNameFrom (sMN 0 "tacticExpr")
1102 n' <- getNameFrom (sMN 0 "tacticExpr")
1103− let scriptTy = RApp (Var (sNS (sUN "Elab") ["Elab", "Reflection", "Language"])) (Var unitTy)
1103+ let scriptTy = RApp (Var (sNS (sUN "Elab")
1104+ ["Elab", "Reflection", "Language"]))
1104 claim n scriptTy
1106 claim n scriptTy
1105 movelast n
1107 movelast n
1106 letbind n' scriptTy (Var n)
1108 letbind n' scriptTy (Var n)
@@ -1108,11 +1110,10 @@ elab ist info emode opts fn tm
1108 elab' ina (Just fc') tm
1110 elab' ina (Just fc') tm
1109 env <- get_env
1111 env <- get_env
1110 runTactical (maybe fc' id fc) env (P Bound n' Erased)
1112 runTactical (maybe fc' id fc) env (P Bound n' Erased)
1111− EState _ _ todo <- getAux
1113 elab' ina fc x = fail $ "Unelaboratable syntactic form " ++ showTmImpls x
1114 elab' ina fc x = fail $ "Unelaboratable syntactic form " ++ showTmImpls x
1115− delayElab t = updateAux (\e -> e { delayed_elab = delayed_elab e ++ [t] })
1116+ delayElab t = updateAux (\e -> e { delayed_elab = delayed_elab e ++ [t] })
1117 isScr :: PTerm -> (Name, Binder Term) -> (Name, (Bool, Binder Term))
1118 isScr :: PTerm -> (Name, Binder Term) -> (Name, (Bool, Binder Term))
1118 isScr (PRef _ n) (n', b) = (n', (n == n', b))
1119 isScr (PRef _ n) (n', b) = (n', (n == n', b))
@@ -1623,6 +1624,7 @@ runTactical fc env tm = do tm' <- eval tm
1623 return ()
1624 return ()
1625 eval tm = do ctxt <- get_context
1626 eval tm = do ctxt <- get_context
1626 return $ normaliseAll ctxt env (finalise tm)
1628 return $ normaliseAll ctxt env (finalise tm)
1628 returnUnit = fmap fst $ get_type_val (Var unitCon)
1630 returnUnit = fmap fst $ get_type_val (Var unitCon)
@@ -1737,7 +1739,7 @@ runTactical fc env tm = do tm' <- eval tm
1737 = return tm
1739 = return tm
1738 | n == tacN "prim__BindElab", [_a, _b, first, andThen] <- args
1740 | n == tacN "prim__BindElab", [_a, _b, first, andThen] <- args
1739 = do first' <- eval first
1741 = do first' <- eval first
1740− res <- runTacTm first'
1742+ res <- eval =<< runTacTm first'
1741 next <- eval (App Complete andThen res)
1743 next <- eval (App Complete andThen res)
1742 runTacTm next
1744 runTacTm next
1743 | n == tacN "prim__Try", [_a, first, alt] <- args
1745 | n == tacN "prim__Try", [_a, first, alt] <- args
@@ -1745,7 +1747,7 @@ runTactical fc env tm = do tm' <- eval tm
1745 alt' <- eval alt
1747 alt' <- eval alt
1746 try' (runTacTm first') (runTacTm alt') True
1748 try' (runTacTm first') (runTacTm alt') True
1747 | n == tacN "prim__Fill", [raw] <- args
1749 | n == tacN "prim__Fill", [raw] <- args
1748− = do raw' <- reifyRaw raw
1750+ = do raw' <- reifyRaw =<< eval raw
1749 apply raw' []
1751 apply raw' []
1750 returnUnit
1752 returnUnit
1751 | n == tacN "prim__Gensym", [hint] <- args
1753 | n == tacN "prim__Gensym", [hint] <- args
@@ -1784,6 +1786,19 @@ runTactical fc env tm = do tm' <- eval tm
1784 Just name -> fmap Just $ reifyTTName name
1786 Just name -> fmap Just $ reifyTTName name
1786 returnUnit
1788 returnUnit
1789+ | n == tacN "prim__Forall", [n, ty] <- args
1790+ = do n' <- reifyTTName n
1792+ forall n' Nothing ty'
1794+ | n == tacN "prim__PatVar", [n] <- args
1795+ = do n' <- reifyTTName n
1798+ | n == tacN "prim__PatBind", [n] <- args
1799+ = do n' <- reifyTTName n
1787 | n == tacN "prim__DeclareType", [decl] <- args
1802 | n == tacN "prim__DeclareType", [decl] <- args
1788 = do (RDeclare n args res) <- reifyTyDecl decl
1803 = do (RDeclare n args res) <- reifyTyDecl decl
1789 ctxt <- get_context
1804 ctxt <- get_context
@@ -1812,6 +1827,26 @@ runTactical fc env tm = do tm' <- eval tm
1812 = do defn <- reifyFunDefn decl
1827 = do defn <- reifyFunDefn decl
1813 defineFunction defn
1828 defineFunction defn
1814 returnUnit
1829 returnUnit
1830+ | n == tacN "prim__RecursiveElab", [goal, script] <- args
1831+ = do goal' <- reifyRaw goal
1832+ ctxt <- get_context
1833+ script <- eval script
1834+ (goalTT, goalTy) <- lift $ check ctxt [] goal'
1835+ lift $ isType ctxt [] goalTy
1836+ recH <- getNameFrom (sMN 0 "recElabHole")
1838+ datatypes <- get_datatypes
1840+ (tm_out, ES (_, aux') _ _) <-
1841+ lift $ runElab aux (runTactical fc env script >> solve >> get_term)
1842+ (newProof recH ctxt datatypes goalTT)
1843+ updateAux $ const aux'
1845+ (tm, ty, _) <- lift $ recheck ctxt env (forget tm_out) tm_out
1846+ let (tm', ty') = (reflect tm, reflect ty)
1847+ fmap fst . get_type_val $
1848+ rawPair (Var $ reflm "TT", Var $ reflm "TT")
1815 | n == tacN "prim__Debug", [ty, msg] <- args
1850 | n == tacN "prim__Debug", [ty, msg] <- args
1816 = do let msg' = fromTTMaybe msg
1851 = do let msg' = fromTTMaybe msg
1817 case msg' of
1852 case msg' of