@@ -49,6 +49,8 @@ import IRTS.Compiler
4949import IRTS.CodegenCommon
5050import IRTS.System
5151
52+import Control.Category
53+import Prelude hiding ((.), id)
5254import Data.List.Split (splitOn)
5355import Data.List (groupBy)
5456import qualified Data.Text as T
@@ -681,6 +683,7 @@ process h fn (NewDefn decls) = logLvl 3 ("Defining names using these decls: " ++
681683 defineName (tyDecl@(PTy docs argdocs syn fc opts name ty) : decls) = do
682684 elabDecl EAll toplevel tyDecl
683685 elabClauses toplevel fc opts name (concatMap getClauses decls)
686+ setReplDefined (getName tyDecl)
684687 defineName [PClauses fc opts _ [clause]] = do
685688 let pterm = getRHS clause
686689 (tm,ty) <- elabVal toplevel ERHS pterm
@@ -688,8 +691,10 @@ process h fn (NewDefn decls) = logLvl 3 ("Defining names using these decls: " ++
688691 let tm' = force (normaliseAll ctxt [] tm)
689692 let ty' = force (normaliseAll ctxt [] ty)
690693 updateContext (addCtxtDef (getClauseName clause) (Function ty' tm'))
691− defineName [PData doc argdocs syn fc opts decl] = do
694+ setReplDefined (Just $ getClauseName clause)
695+ defineName [def @ (PData doc argdocs syn fc opts decl)] = do
692696 elabData toplevel syn doc argdocs fc opts decl
697+ setReplDefined (getName def)
693698 getClauses (PClauses fc opts name clauses) = clauses
694699 getClauses _ = []
695700 getRHS :: PClause -> PTerm
@@ -697,6 +702,27 @@ process h fn (NewDefn decls) = logLvl 3 ("Defining names using these decls: " ++
697702 getRHS (PWith fc name whole with rhs whereBlock) = rhs
698703 getRHS (PClauseR fc with rhs whereBlock) = rhs
699704 getRHS (PWithR fc with rhs whereBlock) = rhs
705+ setReplDefined :: Maybe Name -> Idris ()
706+ setReplDefined Nothing = return ()
707+ setReplDefined (Just n) = do
708+ oldState <- get
709+ put oldState { idris_repl_defs = n : idris_repl_defs oldState }
710+
711+process h fn (Undefine names) = undefine names
712+ where
713+ undefine :: [Name] -> Idris ()
714+ undefine [] = do
715+ allDefined <- idris_repl_defs `fmap` get
716+ undefine' allDefined
717+ undefine names = undefine' names
718+ undefine' [] = return ()
719+ undefine' (n:names) = do
720+ allDefined <- idris_repl_defs `fmap` get
721+ if n `elem` allDefined
722+ then fputState (ctxt_lookup n . known_terms) Nothing
723+ else tclift $ tfail $ Msg ("Can't undefine " ++ show n ++ " because it wasn't defined at the repl")
724+ fmodifyState repl_definitions (delete n)
725+ undefine' names
700726
701727process h fn (ExecVal t)
702728 = do ctxt <- getContext