on master help sign in
implement undefine Tutorial D operator
commit44ec3cddf787cee5c21f014ecb35cb5415799b87 authorAgentM <agentm@themactionfaction.com> dateThu 29 Jan 2015, 08:33 (12 years ago) parent5f5dd31
3 files changed+22−2
RelationExpr.hs+11−1 TutorialDInterpreter.hs+7 TutorialDInterpreterTest.hs+4−1
RelationExpr.hs+11−1
@@ -170,7 +170,14 @@ setRelVar relVarName rel = do
170170 Nothing -> do
171171 put $ DatabaseContext (inclusionDependencies state) newRelVars
172172 return Nothing
173−
173+
174+-- it is not an error to delete a relvar which does not exist, just like it is not an error to insert a pre-existing tuple into a relation
175+deleteRelVar :: String -> DatabaseState (Maybe RelationalError)
176+deleteRelVar relVarName = do
177+ state <- get
178+ let newRelVars = M.delete relVarName (relationVariables state)
179+ put $ DatabaseContext (inclusionDependencies state) newRelVars
180+ return Nothing
174181
175182evalContextExpr :: DatabaseExpr -> DatabaseState (Maybe RelationalError)
176183evalContextExpr (Define relVarName attrs) = do
@@ -180,6 +187,9 @@ evalContextExpr (Define relVarName attrs) = do
180187 False -> setRelVar relVarName emptyRelation
181188 where
182189 emptyRelation = Relation attrs HS.empty
190+
191+evalContextExpr (Undefine relVarName) = do
192+ deleteRelVar relVarName
183193
184194evalContextExpr (Assign relVarName expr) = do
185195 -- in the future, it would be nice to get types from the RelationalExpr instead of needing to evaluate it
TutorialDInterpreter.hs+7
@@ -177,6 +177,7 @@ databaseExpr = insertP
177177 <|> updateP
178178 <|> constraintP
179179 <|> defineP
180+ <|> undefineP
180181 <|> assignP
181182
182183multipleDatabaseExpr :: Parser DatabaseExpr
@@ -200,6 +201,12 @@ defineP = do
200201 attributes <- makeAttributes
201202 return $ Define relVarName attributes
202203
204+undefineP :: Parser DatabaseExpr
205+undefineP = do
206+ reservedOp "undefine"
207+ relVarName <- identifier
208+ return $ Undefine relVarName
209+
203210deleteP :: Parser DatabaseExpr
204211deleteP = do
205212 reservedOp "delete"
TutorialDInterpreterTest.hs+4−1
@@ -30,6 +30,7 @@ main = do
3030 ("x:=true where true and true", Right relationTrue),
3131 ("x:=true=true", Right relationTrue),
3232 ("x:=true=false", Right relationFalse),
33+ ("x:=true; undefine x", Right relationTrue),
3334 ("x:=relation {b int, a char}; insert x relation{tuple{b int(5), a char(\"spam\")}}", mkRelation simpleCAttributes (HS.fromList [RelationTuple $ M.fromList [("a", StringAtom "spam"), ("b", IntAtom 5)]])),
3435 ("x:=relation{tuple{b int(5),a char(\"spam\")},tuple{b int(6),a char(\"sam\")}}; delete x where b=6", mkRelation simpleCAttributes $ HS.fromList [RelationTuple $ M.fromList [("a", StringAtom "spam"), ("b", IntAtom 5)]])
3536 ]
@@ -50,4 +51,6 @@ assertTutdEqual databaseContext tutd expected = assertEqual tutd interpreted exp
5051 where
5152 interpreted = case interpret databaseContext tutd of
5253 (Just err, _) -> Left err
53− (Nothing, context) -> Right $ (relationVariables context) M.! "x"
54+ (Nothing, context) -> case M.lookup "x" (relationVariables context) of
55+ Nothing -> Left $ RelVarNotDefinedError "x"
56+ Just rel -> Right rel