on master help sign in
Added 'public', 'abstract' and 'private' modifiers

'public' means export everything (name and definition) 'abstract' means export just the name 'private' means export nothing for data types and classes, 'abstract' means export the type/class name but not the members.

commit9265e7ccad9f1e3eabf2bcde1db0d6b37a8cf793 authorEdwin Brady <eb@cs.st-andrews.ac.uk> dateThu 29 Dec 2011, 16:32 (15 years ago) parent8ea902d
5 files changed+69−17
src/Core/CoreParser.hs+3−2 src/Core/Evaluate.hs+16−7 src/Idris/AbsSyntax.hs+3−1 src/Idris/Parser.hs+45−5 src/Idris/REPL.hs+2−2
src/Core/CoreParser.hs+3−2
@@ -19,11 +19,12 @@ idrisDef = haskellDef {
1919 opLetter = iOpLetter,
2020 identLetter = identLetter haskellDef <|> lchar '.',
2121 reservedOpNames = [":", "..", "=", "\\", "|", "<-", "->", "=>", "**"],
22− reservedNames = ["let", "in", "data", "Set", -- "if", "then", "else",
23− "do", "dsl", "import", "impossible", -- "refl",
22+ reservedNames = ["let", "in", "data", "Set",
23+ "do", "dsl", "import", "impossible",
2424 "infix", "infixl", "infixr", "prefix",
2525 "where", "with", "forall", "syntax", "proof",
2626 "using", "params", "namespace", "class", "instance",
27+ "public", "private", "abstract",
2728 "Int", "Integer", "Float", "Char", "String", "Ptr"]
2829 }
2930
src/Core/Evaluate.hs+16−7
@@ -1,7 +1,8 @@
11{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,
22 PatternGuards #-}
33
4−module Core.Evaluate(normalise, normaliseC, simplify, specialise, hnf,
4+module Core.Evaluate(normalise, normaliseC, normaliseAll,
5+ simplify, specialise, hnf,
56 Def(..), Accessibility(..),
67 Context, initContext, ctxtAlist, uconstraints, next_tvar,
78 addToCtxt, setAccess, addCtxtDef, addTyDecl, addDatatype,
@@ -20,7 +21,7 @@ import Core.CaseTree
2021type EvalState = ()
2122type Eval a = State EvalState a
2223
23−data EvalOpt = Spec | HNF | Simplify
24+data EvalOpt = Spec | HNF | Simplify | AtREPL
2425 deriving (Show, Eq)
2526
2627-- VALUES (as HOAS) ---------------------------------------------------------
@@ -60,6 +61,11 @@ normaliseC ctxt env t
6061 = evalState (do val <- eval ctxt emptyContext env t []
6162 quote 0 val) ()
6263
64+normaliseAll :: Context -> Env -> TT Name -> TT Name
65+normaliseAll ctxt env t
66+ = evalState (do val <- eval ctxt emptyContext env t [AtREPL]
67+ quote 0 val) ()
68+
6369normalise :: Context -> Env -> TT Name -> TT Name
6470normalise ctxt env t
6571 = evalState (do val <- eval ctxt emptyContext (map finalEntry env) (finalise t) []
@@ -105,11 +111,12 @@ eval :: Context -> Ctxt [Bool] -> Env -> TT Name -> [EvalOpt] -> Eval Value
105111eval ctxt statics genv tm opts = ev True [] tm where
106112 spec = Spec `elem` opts
107113 simpl = Simplify `elem` opts
114+ atRepl = AtREPL `elem` opts
108115
109116 ev top env (P _ n ty)
110117 | Just (Let t v) <- lookup n genv = ev top env v
111− ev top env (P Ref n ty) = case lookupDefAcc Nothing n ctxt of
112− [(Function _ tm, Public)] -> trace ("Eval " ++ show n) $ ev True env tm
118+ ev top env (P Ref n ty) = case lookupDefAcc Nothing n atRepl ctxt of
119+ [(Function _ tm, Public)] -> ev True env tm
113120 [(TyDecl nt ty, _)] -> do vty <- ev True env ty
114121 return $ VP nt n vty
115122 [(CaseOp inl _ _ [] tree, Public)] ->
@@ -153,7 +160,7 @@ eval ctxt statics genv tm opts = ev True [] tm where
153160 apply False env f args
154161 | spec = return $ unload env f args
155162 apply top env (VP Ref n ty) args
156− | [(CaseOp inl _ _ ns tree, Public)] <- lookupDefAcc Nothing n ctxt
163+ | [(CaseOp inl _ _ ns tree, Public)] <- lookupDefAcc Nothing n atRepl ctxt
157164 = -- traceWhen (n == UN ["interp"]) (show (n, args)) $
158165 if simpl && (not inl) then return $ unload env (VP Ref n ty) args
159166 else do c <- evCase top env ns args tree
@@ -548,8 +555,10 @@ lookupP root n ctxt
548555lookupDef :: Maybe [String] -> Name -> Context -> [Def]
549556lookupDef root n ctxt = map fst $ lookupCtxt root n (definitions ctxt)
550557
551−lookupDefAcc :: Maybe [String] -> Name -> Context -> [(Def, Accessibility)]
552−lookupDefAcc root n ctxt = lookupCtxt root n (definitions ctxt)
558+lookupDefAcc :: Maybe [String] -> Name -> Bool -> Context -> [(Def, Accessibility)]
559+lookupDefAcc root n mkpublic ctxt
560+ = map mkp $ lookupCtxt root n (definitions ctxt)
561+ where mkp (d, a) = if mkpublic then (d, Public) else (d, a)
553562
554563lookupVal :: Maybe [String] -> Name -> Context -> [Value]
555564lookupVal root n ctxt
src/Idris/AbsSyntax.hs+3−1
@@ -50,6 +50,7 @@ data IState = IState { tt_ctxt :: Context,
5050 last_proof :: Maybe (Name, [String]),
5151 errLine :: Maybe Int,
5252 lastParse :: Maybe Name,
53+ hide_list :: [(Name, Maybe Accessibility)],
5354 ibc_write :: [IBCWrite]
5455 }
5556
@@ -69,7 +70,8 @@ data IBCWrite = IBCFix FixDecl
6970 deriving Show
7071
7172idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext
72− "" defaultOpts 6 [] [] [] [] [] [] [] [] Nothing Nothing Nothing []
73+ "" defaultOpts 6 [] [] [] [] [] [] [] []
74+ Nothing Nothing Nothing [] []
7375
7476-- The monad for the main REPL - reading and processing files and updating
7577-- global state (hence the IO inner monad).
src/Idris/Parser.hs+45−5
@@ -98,6 +98,8 @@ loadSource lidr f
9898 iLOG ("Finished " ++ f)
9999 let ibc = dropExtension f ++ ".ibc"
100100 iucheck
101+ i <- getIState
102+ addHides (hide_list i)
101103 ok <- noErrors
102104 when ok $
103105 idrisCatch (do writeIBC f ibc; clearIBC)
@@ -107,6 +109,18 @@ loadSource lidr f
107109 namespaces [] ds = ds
108110 namespaces (x:xs) ds = [PNamespace x (namespaces xs ds)]
109111
112+addHides :: [(Name, Maybe Accessibility)] -> Idris ()
113+addHides xs = let (hs, as) = partition isNothing xs in
114+ if null as then return ()
115+ else mapM_ doHide
116+ (map (\ (n, _) -> (n, Hidden)) hs ++
117+ map (\ (n, Just a) -> (n, a)) as)
118+ where isNothing (_, Nothing) = True
119+ isNothing _ = False
120+
121+ doHide (n, a) = do setAccessibility n a
122+ addIBC (IBCAccess n a)
123+
110124parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
111125parseTac i = runParser (do t <- pTactic defaultSyntax
112126 eof
@@ -278,12 +292,14 @@ pSynSym = try (do lchar '['; n <- pName; lchar ']'
278292 return (Symbol sym)
279293
280294pFunDecl' :: SyntaxInfo -> IParser PDecl
281−pFunDecl' syn = try (do n_in <- pfName
295+pFunDecl' syn = try (do acc <- pAccessibility
296+ n_in <- pfName
282297 let n = expandNS syn n_in
283298 ty <- pTSig syn
284299 fc <- pfc
285300 lchar ';'
286301-- ty' <- implicit syn n ty
302+ addAcc n acc
287303 return (PTy syn fc n ty))
288304 <|> try (pPattern syn)
289305
@@ -349,7 +365,8 @@ fixity = try (do reserved "infixl"; return Infixl)
349365--------- Tyoe classes ---------
350366
351367pClass :: SyntaxInfo -> IParser [PDecl]
352−pClass syn = do reserved "class"
368+pClass syn = do acc <- pAccessibility
369+ reserved "class"
353370 fc <- pfc
354371 cons <- pConstList syn
355372 n_in <- pName; let n = expandNS syn n_in
@@ -357,7 +374,9 @@ pClass syn = do reserved "class"
357374 reserved "where"; lchar '{'
358375 ds <- many1 $ pFunDecl syn;
359376 lchar '}'
360− return [PClass syn fc cons n cs (concat ds)]
377+ let allDs = concat ds
378+ accData acc n (concatMap declared allDs)
379+ return [PClass syn fc cons n cs allDs]
361380 where
362381 carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'
363382 return (i, ty)
@@ -465,6 +484,17 @@ pName = do i <- getState
465484pfName = try pName
466485 <|> do lchar '('; o <- operator; lchar ')'; return (UN o)
467486
487+pAccessibility :: IParser (Maybe Accessibility)
488+pAccessibility
489+ = do reserved "public"; return (Just Public)
490+ <|> do reserved "abstract"; return (Just Frozen)
491+ <|> do reserved "private"; return (Just Hidden)
492+ <|> return Nothing
493+
494+addAcc :: Name -> Maybe Accessibility -> IParser ()
495+addAcc n a = do i <- getState
496+ setState (i { hide_list = (n, a) : hide_list i })
497+
468498pSimpleExpr syn =
469499 try (do symbol "!["; t <- pTerm; lchar ']'
470500 return $ PQuote t)
@@ -670,16 +700,25 @@ prefix name f = Prefix (do { reservedOp name; fc <- pfc;
670700
671701--------- Data declarations ---------
672702
703+-- (works for classes too - 'abstract' means the data/class is visible but members not)
704+accData :: Maybe Accessibility -> Name -> [Name] -> IParser ()
705+accData (Just Frozen) n ns = do addAcc n (Just Frozen)
706+ mapM_ (\n -> addAcc n (Just Hidden)) ns
707+accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
708+
673709pData :: SyntaxInfo -> IParser PDecl
674−pData syn = try (do reserved "data"; fc <- pfc
710+pData syn = try (do acc <- pAccessibility
711+ reserved "data"; fc <- pfc
675712 tyn_in <- pfName; ty <- pTSig syn
676713 let tyn = expandNS syn tyn_in
677714 reserved "where"
678715-- ty' <- implicit syn tyn ty
679716 cons <- sepBy (pConstructor syn) (lchar '|')
680717 lchar ';'
718+ accData acc tyn (map (\ (n, _, _) -> n) cons)
681719 return $ PData syn fc (PDatadecl tyn ty cons))
682− <|> do reserved "data"; fc <- pfc
720+ <|> do acc <- pAccessibility
721+ reserved "data"; fc <- pfc
683722 tyn_in <- pfName; args <- many pName
684723 let tyn = expandNS syn tyn_in
685724 lchar '='
@@ -692,6 +731,7 @@ pData syn = try (do reserved "data"; fc <- pfc
692731 do let cty = bindArgs cargs conty
693732-- cty' <- implicit syn x cty
694733 return (x, cty, cfc)) cons
734+ accData acc tyn (map (\ (n, _, _) -> n) cons')
695735 return $ PData syn fc (PDatadecl tyn ty cons')
696736 where
697737 mkPApp fc t [] = t
src/Idris/REPL.hs+2−2
@@ -117,8 +117,8 @@ process Help = iputStrLn displayHelp
117117process (Eval t) = do (tm, ty) <- elabVal toplevel False t
118118 ctxt <- getContext
119119 ist <- get
120− let tm' = normaliseC ctxt [] tm
121− let ty' = normaliseC ctxt [] ty
120+ let tm' = normaliseAll ctxt [] tm
121+ let ty' = normaliseAll ctxt [] ty
122122 logLvl 3 $ "Raw: " ++ show (tm', ty')
123123 imp <- impShow
124124 iputStrLn (showImp imp (delab ist tm') ++ " : " ++