@@ -1730,21 +1730,27 @@ runTactical ist fc env tm = do tm' <- eval tm
1730 Left lhs -> let (ns, lhs') = patvars [] lhs'
1730 Left lhs -> let (ns, lhs') = patvars [] lhs'
1731 in (ns, lhs', Impossible))
1731 in (ns, lhs', Impossible))
1732 clauses'
1732 clauses'
1733− set_context $
1733+ ctxt'<- lift $
1734− addCasedef n (const [])
1734+ addCasedef n (const [])
1735− info False (STerm Erased)
1735+ info False (STerm Erased)
1736− True False -- TODO what are these?
1736+ True False -- TODO what are these?
1737− (map snd $ getArgTys ty) [] -- TODO inaccessible types
1737+ (map snd $ getArgTys ty) [] -- TODO inaccessible types
1738− clauses'
1738+ clauses'
1739− clauses''
1739+ clauses''
1740− clauses''
1740+ clauses''
1741− clauses''
1741+ clauses''
1742− clauses''
1742+ clauses''
1744− ctxt
1745+ set_context ctxt'
1745 updateAux $ \e -> e { new_tyDecls = RClausesInstrs n clauses'' : new_tyDecls e}
1746 updateAux $ \e -> e { new_tyDecls = RClausesInstrs n clauses'' : new_tyDecls e}
1746 return ()
1747 return ()
1749+ checkClosed :: Raw -> Elab' aux (Term, Type)
1750+ checkClosed tm = do ctxt <- get_context
1751+ (val, ty) <- lift $ check ctxt [] tm
1752+ return $! (finalise val, finalise ty)
1748 -- | Do a step in the reflected elaborator monad. The input is the
1754 -- | Do a step in the reflected elaborator monad. The input is the
1749 -- step, the output is the (reflected) term returned.
1755 -- step, the output is the (reflected) term returned.
1750 runTacTm :: Term -> ElabD Term
1756 runTacTm :: Term -> ElabD Term
@@ -1755,12 +1761,12 @@ runTactical ist fc env tm = do tm' <- eval tm
1755 | n == tacN "prim__Goal", [] <- args
1761 | n == tacN "prim__Goal", [] <- args
1756 = do (h:_) <- get_holes
1762 = do (h:_) <- get_holes
1757 t <- goal
1763 t <- goal
1758− fmap fst . get_type_val $
1764+ fmap fst . checkClosed $
1759 rawPair (Var (reflm "TTName"), Var (reflm "TT"))
1765 rawPair (Var (reflm "TTName"), Var (reflm "TT"))
1760 (reflectName h, reflect t)
1766 (reflectName h, reflect t)
1761 | n == tacN "prim__Holes", [] <- args
1767 | n == tacN "prim__Holes", [] <- args
1762 = do hs <- get_holes
1768 = do hs <- get_holes
1763− fmap fst . get_type_val $
1769+ fmap fst . checkClosed $
1764 mkList (Var $ reflm "TTName") (map reflectName hs)
1770 mkList (Var $ reflm "TTName") (map reflectName hs)
1765 | n == tacN "prim__Guess", [] <- args
1771 | n == tacN "prim__Guess", [] <- args
1766 = do ok <- is_guess
1772 = do ok <- is_guess
@@ -1770,7 +1776,7 @@ runTactical ist fc env tm = do tm' <- eval tm
1770 RApp (RApp (Var (sNS (sUN "Just") ["Maybe", "Prelude"]))
1776 RApp (RApp (Var (sNS (sUN "Just") ["Maybe", "Prelude"]))
1771 (Var (reflm "TT")))
1777 (Var (reflm "TT")))
1773− else fmap fst . get_type_val $
1779+ else fmap fst . checkClosed $
1774 RApp (Var (sNS (sUN "Nothing") ["Maybe", "Prelude"]))
1780 RApp (Var (sNS (sUN "Nothing") ["Maybe", "Prelude"]))
1775 (Var (reflm "TT"))
1781 (Var (reflm "TT"))
1776 | n == tacN "prim__LookupTy", [n] <- args
1782 | n == tacN "prim__LookupTy", [n] <- args
@@ -1790,7 +1796,7 @@ runTactical ist fc env tm = do tm' <- eval tm
1790 let defs = [ reflectTriple (reflectName n, reflectNameType nt, reflect ty)
1796 let defs = [ reflectTriple (reflectName n, reflectNameType nt, reflect ty)
1791 | (n, def) <- lookupNameDef n' ctxt
1797 | (n, def) <- lookupNameDef n' ctxt
1792 , let (nt, ty) = getNameTypeAndType def ]
1798 , let (nt, ty) = getNameTypeAndType def ]
1793− fmap fst . get_type_val $
1799+ fmap fst . checkClosed $
1794 rawList (raw_apply (Var pairTy) [ Var (reflm "TTName")
1800 rawList (raw_apply (Var pairTy) [ Var (reflm "TTName")
1795 , raw_apply (Var pairTy) [ Var (reflm "NameType")
1801 , raw_apply (Var pairTy) [ Var (reflm "NameType")
1796 , Var (reflm "TT")]])
1802 , Var (reflm "TT")]])
@@ -1799,15 +1805,15 @@ runTactical ist fc env tm = do tm' <- eval tm
1799 = do n' <- reifyTTName name
1805 = do n' <- reifyTTName name
1800 datatypes <- get_datatypes
1806 datatypes <- get_datatypes
1801 ctxt <- get_context
1807 ctxt <- get_context
1802− fmap fst . get_type_val $
1808+ fmap fst . checkClosed $
1803 rawList (Var (tacN "Datatype"))
1809 rawList (Var (tacN "Datatype"))
1804 (map reflectDatatype (buildDatatypes ctxt datatypes n'))
1810 (map reflectDatatype (buildDatatypes ctxt datatypes n'))
1805 | n == tacN "prim__SourceLocation", [] <- args
1811 | n == tacN "prim__SourceLocation", [] <- args
1806− = fmap fst . get_type_val $
1812+ = fmap fst . checkClosed $
1807 reflectFC fc
1813 reflectFC fc
1808 | n == tacN "prim__Env", [] <- args
1814 | n == tacN "prim__Env", [] <- args
1809 = do env <- get_env
1815 = do env <- get_env
1810− fmap fst . get_type_val $ reflectEnv env
1816+ fmap fst . checkClosed $ reflectEnv env
1811 | n == tacN "prim__Fail", [_a, errs] <- args
1817 | n == tacN "prim__Fail", [_a, errs] <- args
1812 = do errs' <- eval errs
1818 = do errs' <- eval errs
1813 parts <- reifyReportParts errs'
1819 parts <- reifyReportParts errs'
@@ -1843,9 +1849,17 @@ runTactical ist fc env tm = do tm' <- eval tm
1843 ty' <- reifyRaw ty
1849 ty' <- reifyRaw ty
1844 claim n' ty'
1850 claim n' ty'
1845 returnUnit
1851 returnUnit
1852+ | n == tacN "prim__Check", [raw] <- args
1853+ = do raw' <- reifyRaw =<< eval raw
1854+ ctxt <- get_context
1856+ (tm, ty) <- lift $ check ctxt env raw'
1857+ fmap fst . checkClosed $
1858+ rawPair (Var (reflm "TT"), Var (reflm "TT"))
1859+ (reflect tm, reflect ty)
1846 | n == tacN "prim__Forget", [tt] <- args
1860 | n == tacN "prim__Forget", [tt] <- args
1847 = do tt' <- reifyTT tt
1861 = do tt' <- reifyTT tt
1848− fmap fst . get_type_val . reflectRaw $ forget tt'
1862+ fmap fst . checkClosed . reflectRaw $ forget tt'
1849 | n == tacN "prim__Attack", [] <- args
1863 | n == tacN "prim__Attack", [] <- args
1850 = do attack
1864 = do attack
1851 returnUnit
1865 returnUnit
@@ -1874,7 +1888,7 @@ runTactical ist fc env tm = do tm' <- eval tm
1874 returnUnit
1888 returnUnit
1875 | n == tacN "prim__PatVar", [n] <- args
1889 | n == tacN "prim__PatVar", [n] <- args
1876 = do n' <- reifyTTName n
1890 = do n' <- reifyTTName n
1877− patvar n'
1891+ patvar' n'
1878 returnUnit
1892 returnUnit
1879 | n == tacN "prim__PatBind", [n] <- args
1893 | n == tacN "prim__PatBind", [n] <- args
1880 = do n' <- reifyTTName n
1894 = do n' <- reifyTTName n
@@ -1921,6 +1935,19 @@ runTactical ist fc env tm = do tm' <- eval tm
1921 fn <- reifyTTName fn
1935 fn <- reifyTTName fn
1922 resolveTC False True 100 g fn ist
1936 resolveTC False True 100 g fn ist
1923 returnUnit
1937 returnUnit
1938+ | n == tacN "prim__Search", [depth, hints] <- args
1939+ = do d <- eval depth
1940+ hints' <- eval hints
1941+ case (d, unList hints') of
1942+ (Constant (I i), Just hs) ->
1943+ do actualHints <- mapM reifyTTName hs
1945+ let psElab = elab ist toplevel ERHS [] (sMN 0 "tac")
1946+ proofSearch True True False False i psElab Nothing (sMN 0 "search ") actualHints ist
1948+ (Constant (I _), Nothing ) ->
1949+ lift . tfail . InternalMsg $ "Not a list: " ++ show hints'
1950+ (_, _) -> lift . tfail . InternalMsg $ "Can't reify int " ++ show d
1924 | n == tacN "prim__RecursiveElab", [goal, script] <- args
1951 | n == tacN "prim__RecursiveElab", [goal, script] <- args
1925 = do goal' <- reifyRaw goal
1952 = do goal' <- reifyRaw goal
1926 ctxt <- get_context
1953 ctxt <- get_context
@@ -1939,7 +1966,7 @@ runTactical ist fc env tm = do tm' <- eval tm
1939 env' <- get_env
1966 env' <- get_env
1940 (tm, ty, _) <- lift $ recheck ctxt env (forget tm_out) tm_out
1967 (tm, ty, _) <- lift $ recheck ctxt env (forget tm_out) tm_out
1941 let (tm', ty') = (reflect tm, reflect ty)
1968 let (tm', ty') = (reflect tm, reflect ty)
1942− fmap fst . get_type_val $
1969+ fmap fst . checkClosed $
1943 rawPair (Var $ reflm "TT", Var $ reflm "TT")
1970 rawPair (Var $ reflm "TT", Var $ reflm "TT")
1944 (tm', ty')
1971 (tm', ty')
1945 | n == tacN "prim__Debug", [ty, msg] <- args
1972 | n == tacN "prim__Debug", [ty, msg] <- args