exploring-interpreters 0.2.0.0 → 0.3.0.0
raw patch · 6 files changed
+22/−24 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Explorer.Monadic: mkExplorerGSS :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (b, o)) -> b -> Explorer a m b o
+ Language.Explorer.Monadic: mkExplorerGSS :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (Maybe b, o)) -> b -> Explorer a m b o
- Language.Explorer.Monadic: mkExplorerGraph :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (b, o)) -> b -> Explorer a m b o
+ Language.Explorer.Monadic: mkExplorerGraph :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (Maybe b, o)) -> b -> Explorer a m b o
- Language.Explorer.Monadic: mkExplorerStack :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (b, o)) -> b -> Explorer a m b o
+ Language.Explorer.Monadic: mkExplorerStack :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (Maybe b, o)) -> b -> Explorer a m b o
- Language.Explorer.Monadic: mkExplorerTree :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (b, o)) -> b -> Explorer a m b o
+ Language.Explorer.Monadic: mkExplorerTree :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (Maybe b, o)) -> b -> Explorer a m b o
- Language.Explorer.Pure: mkExplorerGSS :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (b, o)) -> b -> Explorer a b o
+ Language.Explorer.Pure: mkExplorerGSS :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (Maybe b, o)) -> b -> Explorer a b o
- Language.Explorer.Pure: mkExplorerGraph :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (b, o)) -> b -> Explorer a b o
+ Language.Explorer.Pure: mkExplorerGraph :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (Maybe b, o)) -> b -> Explorer a b o
- Language.Explorer.Pure: mkExplorerStack :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (b, o)) -> b -> Explorer a b o
+ Language.Explorer.Pure: mkExplorerStack :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (Maybe b, o)) -> b -> Explorer a b o
- Language.Explorer.Pure: mkExplorerTree :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (b, o)) -> b -> Explorer a b o
+ Language.Explorer.Pure: mkExplorerTree :: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (Maybe b, o)) -> b -> Explorer a b o
Files
- CHANGELOG.md +4/−0
- Language/Explorer/Basic.hs +2/−8
- Language/Explorer/Monadic.hs +8/−8
- Language/Explorer/Pure.hs +2/−2
- examples/Whilelang.hs +5/−5
- exploring-interpreters.cabal +1/−1
CHANGELOG.md view
@@ -2,3 +2,7 @@ ## 0.2.0.0 -- 2021-03-15 * First official version. ++## 0.3.0.0 -- 2021-03-16+* Require that definitional interpreters return configurations in the Maybe monad.+ This adds support for run-time errors by returning Nothing when an errors occurs.
Language/Explorer/Basic.hs view
@@ -45,20 +45,14 @@ deref = ExplorerM.deref -- This should be able with func composition.-wrap :: Monad m => (a -> b -> b) -> a -> b -> m (b, ())+wrap :: Monad m => (a -> b -> Maybe b) -> a -> b -> m (Maybe b, ()) wrap def p e = return $ (def p e, ()) -- Constructor for a exploring interpreter.-mkExplorerStack:: (Show a, Eq a, Eq b) => (a -> b -> b) -> b -> Explorer a b+mkExplorerStack, mkExplorerTree, mkExplorerGraph, mkExplorerGSS :: (Show a, Eq a, Eq b) => (a -> b -> Maybe b) -> b -> Explorer a b mkExplorerStack definterp conf = ExplorerM.mkExplorerStack (wrap definterp) conf--mkExplorerTree:: (Show a, Eq a, Eq b) => (a -> b -> b) -> b -> Explorer a b mkExplorerTree definterp conf = ExplorerM.mkExplorerTree (wrap definterp) conf--mkExplorerGraph :: (Show a, Eq a, Eq b) => (a -> b -> b) -> b -> Explorer a b mkExplorerGraph definterp conf = ExplorerM.mkExplorerGraph (wrap definterp) conf--mkExplorerGSS :: (Show a, Eq a, Eq b) => (a -> b -> b) -> b -> Explorer a b mkExplorerGSS definterp conf = ExplorerM.mkExplorerGSS (wrap definterp) conf execute :: (Eq c, Eq p) => p -> Explorer p c -> Explorer p c
Language/Explorer/Monadic.hs view
@@ -41,7 +41,7 @@ Explorer :: (Show programs, Eq programs, Eq configs, Monad m, Monoid output) => { sharing :: Bool , backTracking :: Bool- , defInterp :: programs -> configs -> m (configs, output)+ , defInterp :: programs -> configs -> m (Maybe configs, output) , config :: configs -- Cache the config , currRef :: Ref , genRef :: Ref@@ -50,7 +50,7 @@ } -> Explorer programs m configs output mkExplorer :: (Show a, Eq a, Eq b, Monad m, Monoid o) =>- Bool -> Bool -> (a -> b -> m (b,o)) -> b -> Explorer a m b o+ Bool -> Bool -> (a -> b -> m (Maybe b,o)) -> b -> Explorer a m b o mkExplorer share backtrack definterp conf = Explorer { defInterp = definterp , config = conf@@ -65,7 +65,7 @@ initialRef :: Int initialRef = 1 -mkExplorerStack, mkExplorerTree, mkExplorerGraph, mkExplorerGSS :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (b,o)) -> b -> Explorer a m b o+mkExplorerStack, mkExplorerTree, mkExplorerGraph, mkExplorerGSS :: (Show a, Eq a, Eq b, Monad m, Monoid o) => (a -> b -> m (Maybe b,o)) -> b -> Explorer a m b o mkExplorerStack = mkExplorer False True mkExplorerTree = mkExplorer False False mkExplorerGraph = mkExplorer True False@@ -95,11 +95,11 @@ else addNewPath e p output newconf execute :: (Eq c, Eq p, Eq o, Monad m, Monoid o) => p -> Explorer p m c o -> m (Explorer p m c o, o)-execute p e = do- (newconf,out) <- defInterp e p (config e)- return $ (updateConf e (p, newconf, out), out)--+execute p e =+ do (mcfg, o) <- defInterp e p (config e)+ case mcfg of+ Just cfg -> return $ (updateConf e (p, cfg, o), o)+ Nothing -> return (e, o) executeAll :: (Eq c, Eq p, Eq o, Monad m, Monoid o) => [p] -> Explorer p m c o -> m (Explorer p m c o, o) executeAll ps exp = foldlM executeCollect (exp, mempty) ps
Language/Explorer/Pure.hs view
@@ -42,10 +42,10 @@ deref :: Explorer p c o -> Ref -> Maybe c deref = ExplorerM.deref -wrap :: (Monad m, Monoid o) => (a -> b -> (b,o)) -> a -> b -> m (b, o)+wrap :: (Monad m, Monoid o) => (a -> b -> (Maybe b,o)) -> a -> b -> m (Maybe b, o) wrap def p e = return $ def p e -mkExplorerStack, mkExplorerTree, mkExplorerGraph, mkExplorerGSS:: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (b,o)) -> b -> Explorer a b o+mkExplorerStack, mkExplorerTree, mkExplorerGraph, mkExplorerGSS:: (Show a, Eq a, Eq b, Monoid o) => (a -> b -> (Maybe b,o)) -> b -> Explorer a b o mkExplorerStack definterp conf = ExplorerM.mkExplorerStack (wrap definterp) conf mkExplorerTree definterp conf = ExplorerM.mkExplorerTree (wrap definterp) conf mkExplorerGraph definterp conf = ExplorerM.mkExplorerGraph (wrap definterp) conf
examples/Whilelang.hs view
@@ -112,13 +112,13 @@ initialConfig = Config {cfgStore = Map.empty, cfgOutput = []} -- Definitial interpreter for the while language.-definterp :: Command -> Config -> Config-definterp c cfg = cfg {cfgStore = newstore, cfgOutput = cfgOutput cfg ++ newout}+definterp :: Command -> Config -> Maybe Config+definterp c cfg = Just cfg {cfgStore = newstore, cfgOutput = cfgOutput cfg ++ newout} where ((_, newout), newstore) = runState (runWriterT (evalCommand' c)) (cfgStore cfg) -definterpO :: Command -> Config -> (Config, [String])-definterpO c cfg = (cfg {cfgStore = newstore}, newout)+definterpO :: Command -> Config -> (Maybe Config, [String])+definterpO c cfg = (Just $ cfg {cfgStore = newstore}, newout) where ((_, newout), newstore) = runState (runWriterT (evalCommand' c)) (cfgStore cfg) @@ -218,7 +218,7 @@ whileGraph = E.mkExplorerGraph definterp initialConfig whileGraphM :: WhileExplorerM-whileGraphM = EM.mkExplorerGraph (\p c -> (\c -> (c,())) <$> definterpM p c) initialConfig+whileGraphM = EM.mkExplorerGraph (\p c -> (\c -> (Just c,())) <$> definterpM p c) initialConfig whileGraphO :: WhileExplorerO whileGraphO = EP.mkExplorerGraph definterpO initialConfig
exploring-interpreters.cabal view
@@ -1,7 +1,7 @@ cabal-version: >=1.10 name: exploring-interpreters-version: 0.2.0.0+version: 0.3.0.0 synopsis: A generic exploring interpreter for exploratory programming -- synopsis: -- description: