parsley-core 1.0.1.1 → 1.1.0.0
raw patch · 13 files changed
+107/−70 lines, 13 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Parsley.Internal.Backend.Machine: [BOTTOM] :: Defunc a
- Parsley.Internal.Backend.Machine: [FREEVAR] :: Code a -> Defunc a
- Parsley.Internal.Backend.Machine: [OFFSET] :: Code (Rep o) -> Defunc o
- Parsley.Internal.Backend.Machine: [USER] :: Defunc a -> Defunc a
- Parsley.Internal.Backend.Machine.Defunc: [FREEVAR] :: Code a -> Defunc a
- Parsley.Internal.Backend.Machine.Defunc: [USER] :: Defunc a -> Defunc a
- Parsley.Internal.Backend.Machine.Defunc: genDefunc2 :: Defunc (a -> b -> c) -> Code a -> Code b -> Code c
- Parsley.Internal.Backend.Machine.Instructions: pattern App :: Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : ((x -> y) : xs)) n r a
- Parsley.Internal.Backend.Machine.Instructions: pattern Fmap :: Defunc (x -> y) -> Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : xs) n r a
- Parsley.Internal.Backend.Machine.Instructions: pattern If :: Fix4 (Instr o) xs n r a -> Fix4 (Instr o) xs n r a -> Instr o (Fix4 (Instr o)) (Bool : xs) n r a
+ Parsley.Internal.Backend.Machine: user :: Defunc a -> Defunc a
+ Parsley.Internal.Backend.Machine.Defunc: [LAM] :: Lam a -> Defunc a
+ Parsley.Internal.Backend.Machine.Defunc: pattern FREEVAR :: Code a -> Defunc a
+ Parsley.Internal.Backend.Machine.Defunc: pattern NormLam :: Lam a -> Defunc a
+ Parsley.Internal.Backend.Machine.Defunc: user :: Defunc a -> Defunc a
+ Parsley.Internal.Backend.Machine.Instructions: _App :: Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : ((x -> y) : xs)) n r a
+ Parsley.Internal.Backend.Machine.Instructions: _Fmap :: Defunc (x -> y) -> Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : xs) n r a
+ Parsley.Internal.Backend.Machine.Instructions: _If :: Fix4 (Instr o) xs n r a -> Fix4 (Instr o) xs n r a -> Instr o (Fix4 (Instr o)) (Bool : xs) n r a
+ Parsley.Internal.Core.Lam: instance GHC.Show.Show (Parsley.Internal.Core.Lam.Lam a)
+ Parsley.Internal.Core.Lam: normalise :: Lam a -> Lam a
Files
- ChangeLog.md +5/−0
- parsley-core.cabal +1/−1
- src/ghc-8.10+/Parsley/Internal/Backend/Machine.hs +1/−1
- src/ghc-8.10+/Parsley/Internal/Backend/Machine/Defunc.hs +24/−17
- src/ghc-8.10+/Parsley/Internal/Backend/Machine/Eval.hs +3/−2
- src/ghc-8.10+/Parsley/Internal/Backend/Machine/Ops.hs +2/−1
- src/ghc-8.6+/Parsley/Internal/Backend/Machine.hs +1/−1
- src/ghc-8.6+/Parsley/Internal/Backend/Machine/Defunc.hs +25/−18
- src/ghc-8.6+/Parsley/Internal/Backend/Machine/Eval.hs +2/−1
- src/ghc-8.6+/Parsley/Internal/Backend/Machine/Ops.hs +3/−1
- src/ghc/Parsley/Internal/Backend/CodeGenerator.hs +18/−18
- src/ghc/Parsley/Internal/Backend/Machine/Instructions.hs +8/−8
- src/ghc/Parsley/Internal/Core/Lam.hs +14/−1
ChangeLog.md view
@@ -13,3 +13,8 @@ ## 1.0.1.1 -- 2021-06-27 * Added input factoring to `try p <|> q` and also forms with `f <$> try p <|> q` and `try p $> x <|> q`++## 1.1.0.0 -- 2021-07-01++* Switched both backends to make use of `Lam` instead of `Core.Defunc`, reducing burden on GHC+* Added duplication avoidance optimisation when value to be duplicated is `Lam.Var True`
parsley-core.cabal view
@@ -5,7 +5,7 @@ -- | +------- breaking internal API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 1.0.1.1+version: 1.1.0.0 synopsis: A fast parser combinator library backed by Typed Template Haskell description: This package contains the internals of the @parsley@ package. .
src/ghc-8.10+/Parsley/Internal/Backend/Machine.hs view
@@ -20,7 +20,7 @@ import Data.ByteString (ByteString) import Data.Dependent.Map (DMap) import Data.Text (Text)-import Parsley.Internal.Backend.Machine.Defunc (Defunc(..))+import Parsley.Internal.Backend.Machine.Defunc (Defunc(SAME), user) import Parsley.Internal.Backend.Machine.Identifiers import Parsley.Internal.Backend.Machine.InputOps (InputPrep(..), PositionOps) import Parsley.Internal.Backend.Machine.Instructions
src/ghc-8.10+/Parsley/Internal/Backend/Machine/Defunc.hs view
@@ -1,49 +1,56 @@-{-# LANGUAGE StandaloneKindSignatures, TypeApplications #-}+{-# LANGUAGE PatternSynonyms, StandaloneKindSignatures, TypeApplications, ViewPatterns #-} module Parsley.Internal.Backend.Machine.Defunc (module Parsley.Internal.Backend.Machine.Defunc) where import Data.Proxy (Proxy(Proxy)) import Parsley.Internal.Backend.Machine.InputOps (PositionOps(same)) import Parsley.Internal.Backend.Machine.InputRep (Rep) import Parsley.Internal.Common.Utils (Code)+import Parsley.Internal.Core.Lam (Lam, normaliseGen, normalise) -import qualified Parsley.Internal.Core.Defunc as Core (Defunc, ap, genDefunc, genDefunc1, genDefunc2, unsafeBLACK)+import qualified Parsley.Internal.Core.Defunc as Core (Defunc, lamTerm)+import qualified Parsley.Internal.Core.Lam as Lam (Lam(..)) data Defunc a where- USER :: Core.Defunc a -> Defunc a+ LAM :: Lam a -> Defunc a BOTTOM :: Defunc a SAME :: PositionOps o => Defunc (o -> o -> Bool)- FREEVAR :: Code a -> Defunc a OFFSET :: Code (Rep o) -> Defunc o +user :: Core.Defunc a -> Defunc a+user = LAM . Core.lamTerm+ ap2 :: Defunc (a -> b -> c) -> Defunc a -> Defunc b -> Defunc c-ap2 f@SAME (OFFSET o1) (OFFSET o2) = USER (Core.unsafeBLACK (apSame f o1 o2))+ap2 f@SAME (OFFSET o1) (OFFSET o2) = LAM (Lam.Var False (apSame f o1 o2)) where apSame :: forall o. Defunc (o -> o -> Bool) -> Code (Rep o) -> Code (Rep o) -> Code Bool apSame SAME = same (Proxy @o) apSame _ = undefined-ap2 f x y = USER (Core.ap (Core.ap (seal f) (seal x)) (seal y))+ap2 f x y = LAM (Lam.App (Lam.App (seal f) (seal x)) (seal y)) where- seal :: Defunc a -> Core.Defunc a- seal (USER x) = x- seal x = Core.unsafeBLACK (genDefunc x)+ seal :: Defunc a -> Lam a+ seal (LAM x) = x+ seal x = Lam.Var False (genDefunc x) genDefunc :: Defunc a -> Code a-genDefunc (USER x) = Core.genDefunc x+genDefunc (LAM x) = normaliseGen x genDefunc BOTTOM = [||undefined||]-genDefunc (FREEVAR x) = x genDefunc SAME = error "Cannot materialise the same function in the regular way" genDefunc (OFFSET _) = error "Cannot materialise an unboxed offset in the regular way" genDefunc1 :: Defunc (a -> b) -> Code a -> Code b-genDefunc1 (USER f) qx = Core.genDefunc1 f qx-genDefunc1 f qx = [|| $$(genDefunc f) $$qx ||]+genDefunc1 (LAM f) qx = normaliseGen (Lam.App f (Lam.Var True qx))+genDefunc1 f qx = [|| $$(genDefunc f) $$qx ||] -genDefunc2 :: Defunc (a -> b -> c) -> Code a -> Code b -> Code c-genDefunc2 (USER f) qx qy = Core.genDefunc2 f qx qy-genDefunc2 f qx qy = [|| $$(genDefunc f) $$qx $$qy ||]+pattern NormLam :: Lam a -> Defunc a+pattern NormLam t <- LAM (normalise -> t) +pattern FREEVAR :: Code a -> Defunc a+pattern FREEVAR v <- NormLam (Lam.Var True v)+ where+ FREEVAR v = LAM (Lam.Var True v)+ instance Show (Defunc a) where- show (USER x) = show x+ show (LAM x) = show x show SAME = "same" show BOTTOM = "[[irrelevant]]" show (FREEVAR _) = "x"
src/ghc-8.10+/Parsley/Internal/Backend/Machine/Eval.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE ImplicitParams, MultiWayIf,+ PatternSynonyms, RecordWildCards, TypeApplications, UnboxedTuples #-}@@ -11,7 +12,7 @@ import Control.Monad (forM, liftM2) import Control.Monad.Reader (ask, asks, local) import Control.Monad.ST (runST)-import Parsley.Internal.Backend.Machine.Defunc (Defunc(FREEVAR, OFFSET), genDefunc, genDefunc1, ap2)+import Parsley.Internal.Backend.Machine.Defunc (Defunc(OFFSET), pattern FREEVAR, genDefunc, genDefunc1, ap2) import Parsley.Internal.Backend.Machine.Identifiers (MVar(..), ΦVar, ΣVar) import Parsley.Internal.Backend.Machine.InputOps (InputDependant, PositionOps, LogOps, InputOps(InputOps)) import Parsley.Internal.Backend.Machine.InputRep (Rep)@@ -28,7 +29,7 @@ eval :: forall o a. (Trace, Ops o) => Code (InputDependant (Rep o)) -> LetBinding o a a -> DMap MVar (LetBinding o a) -> Code (Maybe a) eval input (LetBinding !p _) fs = trace ("EVALUATING TOP LEVEL") [|| runST $- do let (# next, more, offset #) = $$input+ do let !(# next, more, offset #) = $$input $$(let ?ops = InputOps [||more||] [||next||] in letRec fs nameLet
src/ghc-8.10+/Parsley/Internal/Backend/Machine/Ops.hs view
@@ -5,6 +5,7 @@ CPP, ImplicitParams, MagicHash,+ PatternSynonyms, RecordWildCards, TypeApplications #-} module Parsley.Internal.Backend.Machine.Ops (module Parsley.Internal.Backend.Machine.Ops) where@@ -20,7 +21,7 @@ import Data.Void (Void) import Debug.Trace (trace) import GHC.Exts (Int(..), (-#))-import Parsley.Internal.Backend.Machine.Defunc (Defunc(FREEVAR, OFFSET), genDefunc)+import Parsley.Internal.Backend.Machine.Defunc (Defunc(OFFSET), genDefunc, pattern FREEVAR) import Parsley.Internal.Backend.Machine.Identifiers (MVar, ΦVar, ΣVar) import Parsley.Internal.Backend.Machine.InputOps (PositionOps(..), LogOps(..), InputOps, next, more) import Parsley.Internal.Backend.Machine.InputRep (Rep{-, representationTypes-})
src/ghc-8.6+/Parsley/Internal/Backend/Machine.hs view
@@ -20,7 +20,7 @@ import Data.ByteString (ByteString) import Data.Dependent.Map (DMap) import Data.Text (Text)-import Parsley.Internal.Backend.Machine.Defunc (Defunc(..))+import Parsley.Internal.Backend.Machine.Defunc (Defunc(SAME), user) import Parsley.Internal.Backend.Machine.Identifiers import Parsley.Internal.Backend.Machine.InputOps (InputPrep(..), PositionOps) import Parsley.Internal.Backend.Machine.InputRep (Rep)
src/ghc-8.6+/Parsley/Internal/Backend/Machine/Defunc.hs view
@@ -1,39 +1,46 @@+{-# LANGUAGE PatternSynonyms, ViewPatterns #-} module Parsley.Internal.Backend.Machine.Defunc (module Parsley.Internal.Backend.Machine.Defunc) where import Parsley.Internal.Backend.Machine.InputOps (PositionOps(same)) import Parsley.Internal.Common.Utils (Code)+import Parsley.Internal.Core.Lam (Lam, normaliseGen, normalise) -import qualified Parsley.Internal.Core.Defunc as Core (Defunc, ap, genDefunc, genDefunc1, genDefunc2, unsafeBLACK)+import qualified Parsley.Internal.Core.Defunc as Core (Defunc, lamTerm)+import qualified Parsley.Internal.Core.Lam as Lam (Lam(..)) data Defunc a where- USER :: Core.Defunc a -> Defunc a+ LAM :: Lam a -> Defunc a BOTTOM :: Defunc a SAME :: PositionOps o => Defunc (o -> o -> Bool)- FREEVAR :: Code a -> Defunc a +user :: Core.Defunc a -> Defunc a+user = LAM . Core.lamTerm+ ap2 :: Defunc (a -> b -> c) -> Defunc a -> Defunc b -> Defunc c-ap2 f x y = USER (Core.ap (Core.ap (seal f) (seal x)) (seal y))+ap2 f x y = LAM (Lam.App (Lam.App (seal f) (seal x)) (seal y)) where- seal :: Defunc a -> Core.Defunc a- seal (USER x) = x- seal x = Core.unsafeBLACK (genDefunc x)+ seal :: Defunc a -> Lam a+ seal (LAM x) = x+ seal x = Lam.Var False (genDefunc x) genDefunc :: Defunc a -> Code a-genDefunc (USER x) = Core.genDefunc x-genDefunc BOTTOM = [||undefined||]-genDefunc SAME = same-genDefunc (FREEVAR x) = x+genDefunc (LAM x) = normaliseGen x+genDefunc BOTTOM = [||undefined||]+genDefunc SAME = same genDefunc1 :: Defunc (a -> b) -> Code a -> Code b-genDefunc1 (USER f) qx = Core.genDefunc1 f qx-genDefunc1 f qx = [|| $$(genDefunc f) $$qx ||]+genDefunc1 (LAM f) qx = normaliseGen (Lam.App f (Lam.Var True qx))+genDefunc1 f qx = [|| $$(genDefunc f) $$qx ||] -genDefunc2 :: Defunc (a -> b -> c) -> Code a -> Code b -> Code c-genDefunc2 (USER f) qx qy = Core.genDefunc2 f qx qy-genDefunc2 f qx qy = [|| $$(genDefunc f) $$qx $$qy ||]+pattern NormLam :: Lam a -> Defunc a+pattern NormLam t <- LAM (normalise -> t) +pattern FREEVAR :: Code a -> Defunc a+pattern FREEVAR v <- NormLam (Lam.Var True v)+ where+ FREEVAR v = LAM (Lam.Var True v)+ instance Show (Defunc a) where- show (USER x) = show x+ show (LAM x) = show x show SAME = "same" show BOTTOM = "[[irrelevant]]"- show (FREEVAR _) = "x"
src/ghc-8.6+/Parsley/Internal/Backend/Machine/Eval.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE ImplicitParams, MultiWayIf,+ PatternSynonyms, RecordWildCards, TypeApplications #-} module Parsley.Internal.Backend.Machine.Eval (eval) where@@ -10,7 +11,7 @@ import Control.Monad (forM, liftM2) import Control.Monad.Reader (ask, asks, local) import Control.Monad.ST (runST)-import Parsley.Internal.Backend.Machine.Defunc (Defunc(FREEVAR), genDefunc, genDefunc1, ap2)+import Parsley.Internal.Backend.Machine.Defunc (Defunc, pattern FREEVAR, genDefunc, genDefunc1, ap2) import Parsley.Internal.Backend.Machine.Identifiers (MVar(..), ΦVar, ΣVar) import Parsley.Internal.Backend.Machine.InputOps (InputDependant(..), PositionOps, BoxOps, LogOps, InputOps(InputOps)) import Parsley.Internal.Backend.Machine.Instructions (Instr(..), MetaInstr(..), Access(..))
src/ghc-8.6+/Parsley/Internal/Backend/Machine/Ops.hs view
@@ -5,6 +5,7 @@ CPP, ImplicitParams, MagicHash,+ PatternSynonyms, RecordWildCards, TypeApplications #-} module Parsley.Internal.Backend.Machine.Ops (module Parsley.Internal.Backend.Machine.Ops) where@@ -16,7 +17,7 @@ import Data.Text (Text) import Data.Void (Void) import Debug.Trace (trace)-import Parsley.Internal.Backend.Machine.Defunc (Defunc(FREEVAR), genDefunc)+import Parsley.Internal.Backend.Machine.Defunc (Defunc, pattern FREEVAR, genDefunc) import Parsley.Internal.Backend.Machine.Identifiers (MVar, ΦVar, ΣVar) import Parsley.Internal.Backend.Machine.InputOps (PositionOps(..), BoxOps(..), LogOps(..), InputOps, next, more) import Parsley.Internal.Backend.Machine.InputRep (Unboxed, OffWith, UnpackedLazyByteString, Stream{-, representationTypes-})@@ -52,6 +53,7 @@ {- General Operations -} dup :: Defunc x -> (Defunc x -> Code r) -> Code r+dup (FREEVAR x) k = k (FREEVAR x) dup x k = [|| let !dupx = $$(genDefunc x) in $$(k (FREEVAR [||dupx||])) ||] {-# INLINE returnST #-}
src/ghc/Parsley/Internal/Backend/CodeGenerator.hs view
@@ -5,8 +5,8 @@ import Data.Maybe (isJust) import Data.Set (Set, elems) import Control.Monad.Trans (lift)-import Parsley.Internal.Backend.Machine (Defunc(USER, SAME), LetBinding, makeLetBinding, Instr(..),- pattern Fmap, pattern App, _Modify, _Get, _Put, _Make, pattern If,+import Parsley.Internal.Backend.Machine (Defunc(SAME), user, LetBinding, makeLetBinding, Instr(..),+ _Fmap, _App, _Modify, _Get, _Put, _Make, _If, addCoins, refundCoins, drainCoins, PositionOps, IMVar, IΦVar, IΣVar, MVar(..), ΦVar(..), ΣVar(..)) import Parsley.Internal.Backend.InstructionAnalyser (coinsNeeded)@@ -51,7 +51,7 @@ rollbackHandler = In4 (Seek (In4 Empt)) parsecHandler :: PositionOps o => Fix4 (Instr o) xs (Succ n) r a -> Fix4 (Instr o) (o : xs) (Succ n) r a-parsecHandler k = In4 (Tell (In4 (Lift2 SAME (In4 (If k (In4 Empt))))))+parsecHandler k = In4 (Tell (In4 (Lift2 SAME (In4 (_If k (In4 Empt)))))) altNoCutCompile :: CodeGen o a y -> CodeGen o a x -> (forall n xs r. Fix4 (Instr o) xs (Succ n) r a -> Fix4 (Instr o) (o : xs) (Succ n) r a)@@ -74,9 +74,9 @@ chainPreCompile op p preOp preP m = do μ <- askM σ <- freshΣ- opc <- freshM (runCodeGen op (In4 (Fmap (USER (FLIP_H COMPOSE)) (In4 (_Modify σ (In4 (Jump μ)))))))- pc <- freshM (runCodeGen p (In4 (App m)))- return $! In4 (Push (USER ID) (In4 (_Make σ (In4 (Iter μ (preOp opc) (parsecHandler (In4 (_Get σ (preP pc)))))))))+ opc <- freshM (runCodeGen op (In4 (_Fmap (user (FLIP_H COMPOSE)) (In4 (_Modify σ (In4 (Jump μ)))))))+ pc <- freshM (runCodeGen p (In4 (_App m)))+ return $! In4 (Push (user ID) (In4 (_Make σ (In4 (Iter μ (preOp opc) (parsecHandler (In4 (_Get σ (preP pc))))))))) chainPostCompile :: PositionOps o => CodeGen o a x -> CodeGen o a (x -> x) -> (forall n xs r. Fix4 (Instr o) xs (Succ n) r a -> Fix4 (Instr o) xs (Succ n) r a)@@ -89,10 +89,10 @@ freshM (runCodeGen p (In4 (_Make σ (In4 (Iter μ (preOp opc) (parsecHandler (In4 (_Get σ (preM m))))))))) deep :: PositionOps o => Combinator (Cofree Combinator (CodeGen o a)) x -> Maybe (CodeGen o a x)-deep (f :<$>: (p :< _)) = Just $ CodeGen $ \m -> runCodeGen p (In4 (Fmap (USER f) m))+deep (f :<$>: (p :< _)) = Just $ CodeGen $ \m -> runCodeGen p (In4 (_Fmap (user f) m)) deep (TryOrElse p q) = Just $ CodeGen $ altNoCutCompile p q (In4 . Seek) id-deep ((_ :< (Try (p :< _) :$>: x)) :<|>: (q :< _)) = Just $ CodeGen $ altNoCutCompile p q (In4 . Seek) (In4 . Pop . In4 . Push (USER x))-deep ((_ :< (f :<$>: (_ :< Try (p :< _)))) :<|>: (q :< _)) = Just $ CodeGen $ altNoCutCompile p q (In4 . Seek) (In4 . Fmap (USER f))+deep ((_ :< (Try (p :< _) :$>: x)) :<|>: (q :< _)) = Just $ CodeGen $ altNoCutCompile p q (In4 . Seek) (In4 . Pop . In4 . Push (user x))+deep ((_ :< (f :<$>: (_ :< Try (p :< _)))) :<|>: (q :< _)) = Just $ CodeGen $ altNoCutCompile p q (In4 . Seek) (In4 . _Fmap (user f)) deep (MetaCombinator RequiresCut (_ :< ((p :< _) :<|>: (q :< _)))) = Just $ CodeGen $ \m -> do (binder, φ) <- makeΦ m pc <- freshΦ (runCodeGen p (deadCommitOptimisation φ))@@ -107,9 +107,9 @@ addCoinsNeeded = coinsNeeded >>= addCoins shallow :: PositionOps o => Combinator (CodeGen o a) x -> Fix4 (Instr o) (x : xs) (Succ n) r a -> CodeGenStack (Fix4 (Instr o) xs (Succ n) r a)-shallow (Pure x) m = do return $! In4 (Push (USER x) m)-shallow (Satisfy p) m = do return $! In4 (Sat (USER p) m)-shallow (pf :<*>: px) m = do pxc <- runCodeGen px (In4 (App m)); runCodeGen pf pxc+shallow (Pure x) m = do return $! In4 (Push (user x) m)+shallow (Satisfy p) m = do return $! In4 (Sat (user p) m)+shallow (pf :<*>: px) m = do pxc <- runCodeGen px (In4 (_App m)); runCodeGen pf pxc shallow (p :*>: q) m = do qc <- runCodeGen q m; runCodeGen p (In4 (Pop qc)) shallow (p :<*: q) m = do qc <- runCodeGen q (In4 (Pop m)); runCodeGen p qc shallow Empty _ = do return $! In4 Empt@@ -122,11 +122,11 @@ do pc <- runCodeGen p (In4 (Pop (In4 (Seek (In4 (Commit (In4 Empt))))))) let np = coinsNeeded pc let nm = coinsNeeded m- return $! In4 (Catch (addCoins (max (np - nm) 0) (In4 (Tell pc))) (In4 (Seek (In4 (Push (USER UNIT) m)))))+ return $! In4 (Catch (addCoins (max (np - nm) 0) (In4 (Tell pc))) (In4 (Seek (In4 (Push (user UNIT) m))))) shallow (Branch b p q) m = do (binder, φ) <- makeΦ m- pc <- freshΦ (runCodeGen p (In4 (Swap (In4 (App φ)))))- qc <- freshΦ (runCodeGen q (In4 (Swap (In4 (App φ)))))+ pc <- freshΦ (runCodeGen p (In4 (Swap (In4 (_App φ)))))+ qc <- freshΦ (runCodeGen q (In4 (Swap (In4 (_App φ))))) let minc = coinsNeeded (In4 (Case pc qc)) let dp = max 0 (coinsNeeded pc - minc) let dq = max 0 (coinsNeeded qc - minc)@@ -135,15 +135,15 @@ do (binder, φ) <- makeΦ m qcs <- traverse (\q -> freshΦ (runCodeGen q φ)) qs defc <- freshΦ (runCodeGen def φ)- let minc = coinsNeeded (In4 (Choices (map USER fs) qcs defc))+ let minc = coinsNeeded (In4 (Choices (map user fs) qcs defc)) let defc':qcs' = map (max 0 . subtract minc . coinsNeeded >>= addCoins) (defc:qcs)- fmap binder (runCodeGen p (In4 (Choices (map USER fs) qcs' defc')))+ fmap binder (runCodeGen p (In4 (Choices (map user fs) qcs' defc'))) shallow (Let _ μ _) m = do return $! tailCallOptimise μ m shallow (ChainPre op p) m = do chainPreCompile op p addCoinsNeeded id m shallow (ChainPost p op) m = do chainPostCompile p op addCoinsNeeded id m shallow (MakeRegister σ p q) m = do qc <- runCodeGen q m; runCodeGen p (In4 (_Make σ qc)) shallow (GetRegister σ) m = do return $! In4 (_Get σ m)-shallow (PutRegister σ p) m = do runCodeGen p (In4 (_Put σ (In4 (Push (USER UNIT) m))))+shallow (PutRegister σ p) m = do runCodeGen p (In4 (_Put σ (In4 (Push (user UNIT) m)))) shallow (Debug name p) m = do fmap (In4 . LogEnter name) (runCodeGen p (In4 (Commit (In4 (LogExit name m))))) shallow (MetaCombinator Cut p) m = do runCodeGen p (addCoins (coinsNeeded m) m)
src/ghc/Parsley/Internal/Backend/Machine/Instructions.hs view
@@ -8,7 +8,7 @@ import Parsley.Internal.Backend.Machine.Identifiers (MVar, ΦVar, ΣVar) import Parsley.Internal.Common (IFunctor4, Fix4(In4), Const4(..), imap4, cata4, Nat(..), One, intercalateDiff) -import Parsley.Internal.Backend.Machine.Defunc as Machine (Defunc(USER))+import Parsley.Internal.Backend.Machine.Defunc as Machine (Defunc, user) import Parsley.Internal.Core.Defunc as Core (Defunc(ID), pattern FLIP_H) data Instr (o :: Type) (k :: [Type] -> Nat -> Type -> Type -> Type) (xs :: [Type]) (n :: Nat) (r :: Type) (a :: Type) where@@ -56,14 +56,14 @@ drainCoins :: Int -> Fix4 (Instr o) xs (Succ n) r a -> Fix4 (Instr o) xs (Succ n) r a drainCoins = mkCoin DrainCoins -pattern App :: Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : (x -> y) : xs) n r a-pattern App k = Lift2 (USER ID) k+_App :: Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : (x -> y) : xs) n r a+_App k = Lift2 (user ID) k -pattern Fmap :: Machine.Defunc (x -> y) -> Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : xs) n r a-pattern Fmap f k = Push f (In4 (Lift2 (USER (FLIP_H ID)) k))+_Fmap :: Machine.Defunc (x -> y) -> Fix4 (Instr o) (y : xs) n r a -> Instr o (Fix4 (Instr o)) (x : xs) n r a+_Fmap f k = Push f (In4 (Lift2 (user (FLIP_H ID)) k)) _Modify :: ΣVar x -> Fix4 (Instr o) xs n r a -> Instr o (Fix4 (Instr o)) ((x -> x) : xs) n r a-_Modify σ = _Get σ . In4 . App . In4 . _Put σ+_Modify σ = _Get σ . In4 . _App . In4 . _Put σ _Make :: ΣVar x -> k xs n r a -> Instr o k (x : xs) n r a _Make σ = Make σ Hard@@ -75,8 +75,8 @@ _Get σ = Get σ Hard -- This this is a nice little trick to get this instruction to generate optimised code-pattern If :: Fix4 (Instr o) xs n r a -> Fix4 (Instr o) xs n r a -> Instr o (Fix4 (Instr o)) (Bool : xs) n r a-pattern If t e = Choices [USER ID] [t] e+_If :: Fix4 (Instr o) xs n r a -> Fix4 (Instr o) xs n r a -> Instr o (Fix4 (Instr o)) (Bool : xs) n r a+_If t e = Choices [user ID] [t] e instance IFunctor4 (Instr o) where imap4 _ Ret = Ret
src/ghc/Parsley/Internal/Core/Lam.hs view
@@ -1,4 +1,4 @@-module Parsley.Internal.Core.Lam (normaliseGen, Lam(..)) where+module Parsley.Internal.Core.Lam (normaliseGen, normalise, Lam(..)) where import Parsley.Internal.Common.Utils (Code) @@ -47,3 +47,16 @@ normaliseGen :: Lam a -> Code a normaliseGen = generate . normalise++instance Show (Lam a) where+ show = show' . normalise++show' :: Lam a -> String+show' (Abs f) = concat ["(\\x -> ", show (f (Var True undefined)), ")"]+show' (App f x) = concat ["(", show' f, " ", show' x, ")"]+show' (Var True _) = "x"+show' (Var False _) = "complex"+show' (If c t e) = concat ["if ", show' c, " then ", show t, " else ", show e]+show' (Let x f) = concat ["let x = ", show x, " in ", show' (f (Var True undefined))]+show' T = "True"+show' F = "False"