imperative-edsl 0.6 → 0.7
raw patch · 7 files changed
+130/−108 lines, 7 filesdep ~mainland-prettyPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: mainland-pretty
API changes (from Hackage documentation)
- Language.Embedded.Concurrent.CMD: instance forall k (instr :: (* -> *, (* -> *, (k, *))) -> * -> *) env. (Language.Embedded.Concurrent.CMD.ThreadCMD Data.ALaCarte.:<: instr) => Control.Monad.Operational.Higher.Reexpressible Language.Embedded.Concurrent.CMD.ThreadCMD instr env
- Language.Embedded.Concurrent.CMD: instance forall k (pred :: k). Control.Monad.Operational.Higher.InterpBi Language.Embedded.Concurrent.CMD.ThreadCMD GHC.Types.IO (Data.ALaCarte.Param1 pred)
- Language.Embedded.Imperative.CMD: [InitArr] :: (pred a, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: [InitCArr] :: (pred a, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: instance (GHC.Classes.Eq a, GHC.Arr.Ix i) => GHC.Classes.Eq (Language.Embedded.Imperative.CMD.IArr i a)
- Language.Embedded.Imperative.CMD: instance (GHC.Show.Show a, GHC.Show.Show i, GHC.Arr.Ix i) => GHC.Show.Show (Language.Embedded.Imperative.CMD.IArr i a)
- Language.Embedded.Imperative.CMD: instance GHC.Classes.Ord Language.Embedded.Imperative.CMD.Object
- Language.Embedded.Imperative.CMD: instance forall k (pred :: k). Control.Monad.Operational.Higher.InterpBi Language.Embedded.Imperative.CMD.PtrCMD GHC.Types.IO (Data.ALaCarte.Param1 pred)
- Language.Embedded.Imperative.CMD: instance forall k k1 (instr :: (* -> *, (k -> *, (k1, *))) -> * -> *) env. (Language.Embedded.Imperative.CMD.PtrCMD Data.ALaCarte.:<: instr) => Control.Monad.Operational.Higher.Reexpressible Language.Embedded.Imperative.CMD.PtrCMD instr env
- Language.Embedded.Imperative.Frontend: initArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend: initIArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr, Monad m) => [a] -> ProgramT instr (Param2 exp pred) m (IArr i a)
- Language.Embedded.Imperative.Frontend: initNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => String -> [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Concurrent.CMD: instance Language.Embedded.Traversal.DryInterp Language.Embedded.Concurrent.CMD.ChanCMD
+ Language.Embedded.Concurrent.CMD: instance Language.Embedded.Traversal.DryInterp Language.Embedded.Concurrent.CMD.ThreadCMD
+ Language.Embedded.Concurrent.CMD: instance forall k2 (instr :: (* -> *, (* -> *, (k2, *))) -> * -> *) env. (Language.Embedded.Concurrent.CMD.ThreadCMD Data.ALaCarte.:<: instr) => Control.Monad.Operational.Higher.Reexpressible Language.Embedded.Concurrent.CMD.ThreadCMD instr env
+ Language.Embedded.Concurrent.CMD: instance forall k2 (pred :: k2). Control.Monad.Operational.Higher.InterpBi Language.Embedded.Concurrent.CMD.ThreadCMD GHC.Types.IO (Data.ALaCarte.Param1 pred)
+ Language.Embedded.Imperative.CMD: [ConstArr] :: (pred a, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: [ConstCArr] :: (pred a, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: instance (GHC.Show.Show i, GHC.Show.Show a, GHC.Arr.Ix i) => GHC.Show.Show (Language.Embedded.Imperative.CMD.IArr i a)
+ Language.Embedded.Imperative.CMD: instance GHC.Classes.Eq (Language.Embedded.Imperative.CMD.Arr i a)
+ Language.Embedded.Imperative.CMD: instance GHC.Classes.Eq (Language.Embedded.Imperative.CMD.Ref a)
+ Language.Embedded.Imperative.CMD: instance GHC.Classes.Eq Language.Embedded.Imperative.CMD.Handle
+ Language.Embedded.Imperative.CMD: instance GHC.Show.Show Language.Embedded.Imperative.CMD.Handle
+ Language.Embedded.Imperative.CMD: instance Language.Embedded.Imperative.CMD.IsPointer (Language.Embedded.Imperative.CMD.Ptr a)
+ Language.Embedded.Imperative.CMD: instance forall k k2 (instr :: (* -> *, (k -> *, (k2, *))) -> * -> *) env. (Language.Embedded.Imperative.CMD.PtrCMD Data.ALaCarte.:<: instr) => Control.Monad.Operational.Higher.Reexpressible Language.Embedded.Imperative.CMD.PtrCMD instr env
+ Language.Embedded.Imperative.CMD: instance forall k2 (pred :: k2). Control.Monad.Operational.Higher.InterpBi Language.Embedded.Imperative.CMD.PtrCMD GHC.Types.IO (Data.ALaCarte.Param1 pred)
+ Language.Embedded.Imperative.Frontend: constArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: constNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => String -> [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Backend.C: def :: Default a => a
+ Language.Embedded.Backend.C: def :: a
- Language.Embedded.Imperative: class (:<:) k k1 (sub :: k1 -> k -> *) (sup :: k1 -> k -> *)
+ Language.Embedded.Imperative: class (:<:) k k1 (sub :: k -> k1 -> *) (sup :: k -> k1 -> *)
- Language.Embedded.Imperative: data (:+:) k k1 (h1 :: k1 -> k -> *) (h2 :: k1 -> k -> *) (fs :: k1) (a :: k) :: forall k k1. (k1 -> k -> *) -> (k1 -> k -> *) -> k1 -> k -> *
+ Language.Embedded.Imperative: data (:+:) k k1 (h1 :: k -> k1 -> *) (h2 :: k -> k1 -> *) (fs :: k) (a :: k1) :: forall k k1. (k -> k1 -> *) -> (k -> k1 -> *) -> k -> k1 -> *
- Language.Embedded.Imperative: interpret :: (Interp * k i m fs, HFunctor * * k i, Monad m) => Program k i fs a -> m a
+ Language.Embedded.Imperative: interpret :: (Interp k * i m fs, HFunctor * * k i, Monad m) => Program k i fs a -> m a
- Language.Embedded.Imperative: interpretBi :: (InterpBi * k i m fs, HBifunctor * * k i, Functor m, Monad m) => (forall b. exp b -> m b) -> Program (* -> *, k) i ((,) (* -> *) k exp fs) a -> m a
+ Language.Embedded.Imperative: interpretBi :: (InterpBi k * i m fs, HBifunctor * * k i, Functor m, Monad m) => (forall b. exp b -> m b) -> Program (* -> *, k) i ((,) (* -> *) k exp fs) a -> m a
- Language.Embedded.Imperative: interpretBiT :: (InterpBi * k i m fs, HBifunctor * * k i, Functor m, Monad m, Monad n) => (forall b. exp b -> m b) -> (forall b. n b -> m b) -> ProgramT (* -> *, k) i ((,) (* -> *) k exp fs) n a -> m a
+ Language.Embedded.Imperative: interpretBiT :: (InterpBi k * i m fs, HBifunctor * * k i, Functor m, Monad m, Monad n) => (forall b. exp b -> m b) -> (forall b. n b -> m b) -> ProgramT (* -> *, k) i ((,) (* -> *) k exp fs) n a -> m a
- Language.Embedded.Imperative: interpretT :: (Interp * k i m fs, HFunctor * * k i, Monad m) => (forall b. n b -> m b) -> ProgramT k i fs n a -> m a
+ Language.Embedded.Imperative: interpretT :: (Interp k * i m fs, HFunctor * * k i, Monad m) => (forall b. n b -> m b) -> ProgramT k i fs n a -> m a
- Language.Embedded.Imperative: type Param2 k k1 (a :: k1) (b :: k) = (,) k1 (k, *) a (Param1 k b)
+ Language.Embedded.Imperative: type Param2 k k1 (a :: k) (b :: k1) = (,) k (k1, *) a (Param1 k1 b)
- Language.Embedded.Imperative: type Param3 k k1 k2 (a :: k2) (b :: k1) (c :: k) = (,) k2 (k1, (k, *)) a (Param2 k k1 b c)
+ Language.Embedded.Imperative: type Param3 k k1 k2 (a :: k) (b :: k1) (c :: k2) = (,) k (k1, (k2, *)) a (Param2 k1 k2 b c)
- Language.Embedded.Imperative.CMD: [GetArr] :: (pred a, Integral i, Ix i) => exp i -> Arr i a -> ArrCMD (Param3 prog exp pred) (Val a)
+ Language.Embedded.Imperative.CMD: [GetArr] :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> ArrCMD (Param3 prog exp pred) (Val a)
- Language.Embedded.Imperative.CMD: [SetArr] :: (pred a, Integral i, Ix i) => exp i -> exp a -> Arr i a -> ArrCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [SetArr] :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> exp a -> ArrCMD (Param3 prog exp pred) ()
- Language.Embedded.Imperative.Frontend: getArr :: (pred a, FreeExp exp, FreePred exp a, Integral i, Ix i, ArrCMD :<: instr, Monad m) => exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp a)
+ Language.Embedded.Imperative.Frontend: getArr :: (pred a, FreeExp exp, FreePred exp a, Integral i, Ix i, ArrCMD :<: instr, Monad m) => Arr i a -> exp i -> ProgramT instr (Param2 exp pred) m (exp a)
- Language.Embedded.Imperative.Frontend: setArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => exp i -> exp a -> Arr i a -> ProgramT instr (Param2 exp pred) m ()
+ Language.Embedded.Imperative.Frontend: setArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> exp i -> exp a -> ProgramT instr (Param2 exp pred) m ()
Files
- examples/Concurrent.hs +3/−3
- imperative-edsl.cabal +2/−4
- src/Language/Embedded/Concurrent/CMD.hs +19/−2
- src/Language/Embedded/Imperative/Backend/C.hs +24/−16
- src/Language/Embedded/Imperative/CMD.hs +49/−45
- src/Language/Embedded/Imperative/Frontend.hs +10/−15
- tests/Imperative.hs +23/−23
examples/Concurrent.hs view
@@ -97,12 +97,12 @@ b <- readChan c printf "%d %d\n" a b - sent :: Arr Int8 Int32 <- initArr [ 12, 34 ]+ sent :: Arr Int8 Int32 <- constArr [ 12, 34 ] writeChanBuf c (0 :: CExp Int8) 2 sent received <- newArr (2 :: CExp Int8) readChanBuf c (0 :: CExp Int8) 2 received- a <- getArr 0 received- b <- getArr 1 received+ a <- getArr received 0+ b <- getArr received 1 printf "%d %d\n" a b writeChan' c (67 :: CExp Word8)
imperative-edsl.cabal view
@@ -1,12 +1,10 @@ name: imperative-edsl-version: 0.6+version: 0.7 synopsis: Deep embedding of imperative programs with code generation description: Deep embedding of imperative programs with code generation. . The main module for users who want to write imperative- programs is "Language.Embedded.Imperative" (and optionally- "Language.Embedded.CExp" which provides a simple expression- language).+ programs is "Language.Embedded.Imperative". . Examples can be found in the @examples@ directory. license: BSD3
src/Language/Embedded/Concurrent/CMD.hs view
@@ -27,6 +27,8 @@ import Data.Ix (Ix) import Data.Maybe (fromMaybe) +import Control.Monads+import Language.Embedded.Traversal import Language.Embedded.Expression import Language.Embedded.Imperative.CMD import Language.Embedded.Imperative (getArr, setArr)@@ -150,6 +152,12 @@ hbimap _ _ (Wait tid) = Wait tid hbimap _ g (Sleep us) = Sleep $ g us +instance DryInterp ThreadCMD where+ dryInterp (ForkWithId _) = liftM TIDComp $ freshStr "t"+ dryInterp (Kill _) = return ()+ dryInterp (Wait _) = return ()+ dryInterp (Sleep _) = return ()+ instance (ThreadCMD :<: instr) => Reexpressible ThreadCMD instr env where reexpressInstrEnv reexp (ForkWithId p) = ReaderT $ \env -> singleInj $ ForkWithId (flip runReaderT env . p)@@ -175,6 +183,15 @@ hbimap _ _ (CloseChan c ) = CloseChan c hbimap _ _ (ReadOK c) = ReadOK c +instance DryInterp ChanCMD where+ dryInterp (NewChan _) = liftM ChanComp $ freshStr "chan"+ dryInterp (ReadOne _) = liftM ValComp $ freshStr "v"+ dryInterp (ReadChan _ _ _ _) = liftM ValComp $ freshStr "v"+ dryInterp (WriteOne _ _) = liftM ValComp $ freshStr "v"+ dryInterp (WriteChan _ _ _ _) = liftM ValComp $ freshStr "v"+ dryInterp (CloseChan _) = return ()+ dryInterp (ReadOK _) = liftM ValComp $ freshStr "v"+ instance (ChanCMD :<: instr) => Reexpressible ChanCMD instr env where reexpressInstrEnv reexp (NewChan sz) = lift . singleInj . NewChan =<< mapSizeExpA reexp sz@@ -221,7 +238,7 @@ xs <- Chan.readChan c $ fromIntegral (len' - off') let xs' = map convertDynamic xs interpretBi id $ forM_ (zip [off' .. ] xs') $ \(i, x) -> do- setArr (return i) (return x) arr :: Program ArrCMD (Param2 IO pred) ()+ setArr arr (return i) (return x) :: Program ArrCMD (Param2 IO pred) () ValRun <$> Chan.lastReadOK c runChanCMD (WriteOne (ChanRun c) x) = ValRun <$> (Chan.writeChan c . return . toDyn =<< x)@@ -229,7 +246,7 @@ off' <- off len' <- len xs <- interpretBi id $ forM [off' .. off' + len' - 1] $ \i -> do- getArr (return i) arr :: Program ArrCMD (Param2 IO pred) (IO el)+ getArr arr (return i) :: Program ArrCMD (Param2 IO pred) (IO el) ValRun <$> (Chan.writeChan c =<< map toDyn <$> sequence xs) runChanCMD (CloseChan (ChanRun c)) = Chan.closeChan c runChanCMD (ReadOK (ChanRun c)) = ValRun <$> Chan.lastReadOK c
src/Language/Embedded/Imperative/Backend/C.hs view
@@ -83,15 +83,15 @@ compArrCMD :: forall exp ct a. (CompExp exp, CompTypeClass ct) => ArrCMD (Param3 CGen exp ct) a -> CGen a compArrCMD cmd@(NewArr base size) = compC_CMD (NewCArr base Nothing size :: C_CMD (Param3 CGen exp ct) a)-compArrCMD cmd@(InitArr base as) = compC_CMD (InitCArr base Nothing as :: C_CMD (Param3 CGen exp ct) a)-compArrCMD cmd@(GetArr expi arr) = do+compArrCMD cmd@(ConstArr base as) = compC_CMD (ConstCArr base Nothing as :: C_CMD (Param3 CGen exp ct) a)+compArrCMD cmd@(GetArr arr expi) = do v <- freshVar (proxyPred cmd) i <- compExp expi touchVar $ BaseArrOf arr -- explanation above touchVar arr addStm [cstm| $id:v = $id:arr[ $i ]; |] return v-compArrCMD (SetArr expi expv arr) = do+compArrCMD (SetArr arr expi expv) = do v <- compExp expv i <- compExp expi touchVar $ BaseArrOf arr -- explanation above@@ -121,13 +121,17 @@ ControlCMD (Param3 CGen exp ct) a -> CGen a compControlCMD (If c t f) = do cc <- compExp c- ct <- inNewBlock_ t- cf <- inNewBlock_ f- case (ct, cf) of- ([],[]) -> return ()- (_ ,[]) -> addStm [cstm| if ( $cc) {$items:ct} |]- ([],_ ) -> addStm [cstm| if ( ! $cc) {$items:cf} |]- (_ ,_ ) -> addStm [cstm| if ( $cc) {$items:ct} else {$items:cf} |]+ case cc of+ C.Var (C.Id "true" _) _ -> t+ C.Var (C.Id "false" _) _ -> f+ _ -> do+ ct <- inNewBlock_ t+ cf <- inNewBlock_ f+ case (ct, cf) of+ ([],[]) -> return ()+ (_ ,[]) -> addStm [cstm| if ( $cc) {$items:ct} |]+ ([],_ ) -> addStm [cstm| if ( ! $cc) {$items:cf} |]+ (_ ,_ ) -> addStm [cstm| if ( $cc) {$items:ct} else {$items:cf} |] compControlCMD (While cont body) = do s <- get noop <- do@@ -173,11 +177,15 @@ compPtrCMD :: PtrCMD (Param3 prog exp pred) a -> CGen a compPtrCMD (SwapPtr a b) = do- sym <- gensym "tmp"- addLocal [cdecl| void * $id:sym; |]- addStm [cstm| $id:sym = $id:a; |]- addStm [cstm| $id:a = $id:b; |]- addStm [cstm| $id:b = $id:sym; |]+ let swap_ptr =+ "#define swap_ptr(a,b) do {void* TmP=a; a=b; b=TmP;} while (0)"+ -- See this solution on the use of `do{}while(0)`:+ -- <http://stackoverflow.com/a/3982397/1105347>+ --+ -- The name "TmP" is to make it very unlikely to have the same name as `a`+ -- or `b`.+ addGlobal [cedecl| $esc:swap_ptr |]+ addStm [cstm| swap_ptr($id:a, $id:b); |] compIOMode :: IOMode -> String compIOMode ReadMode = "r"@@ -249,7 +257,7 @@ _ -> addItem [citem| $ty:t $id:sym'[ $n ]; |] addItem [citem| $ty:t * $id:sym = $id:sym'; |] -- explanation at 'compArrCMD' return $ ArrComp sym-compC_CMD cmd@(InitCArr base align as) = do+compC_CMD cmd@(ConstCArr base align as) = do sym <- gensym base let sym' = '_':sym t <- compType (proxyPred cmd) (proxyArg cmd)
src/Language/Embedded/Imperative/CMD.hs view
@@ -88,7 +88,7 @@ data Ref a = RefComp VarId | RefRun (IORef a)- deriving Typeable+ deriving (Eq, Typeable) instance ToIdent (Ref a) where toIdent (RefComp r) = C.Id r @@ -152,13 +152,13 @@ = ArrComp VarId | ArrRun (IORef (IOArray i a)) -- The `IORef` is needed in order to make the `IsPointer` instance- deriving Typeable+ deriving (Eq, Typeable) -- | Immutable array data IArr i a = IArrComp VarId | IArrRun (Array i a)- deriving (Eq, Show, Typeable)+ deriving (Show, Typeable) -- In a way, it's not terribly useful to have `Arr` parameterized on the index -- type, since it's required to be an integer type, and it doesn't really matter@@ -182,11 +182,11 @@ -- | Commands for mutable arrays data ArrCMD fs a where- NewArr :: (pred a, Integral i, Ix i) => String -> exp i -> ArrCMD (Param3 prog exp pred) (Arr i a)- InitArr :: (pred a, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)- GetArr :: (pred a, Integral i, Ix i) => exp i -> Arr i a -> ArrCMD (Param3 prog exp pred) (Val a)- SetArr :: (pred a, Integral i, Ix i) => exp i -> exp a -> Arr i a -> ArrCMD (Param3 prog exp pred) ()- CopyArr :: (pred a, Integral i, Ix i) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ArrCMD (Param3 prog exp pred) ()+ NewArr :: (pred a, Integral i, Ix i) => String -> exp i -> ArrCMD (Param3 prog exp pred) (Arr i a)+ ConstArr :: (pred a, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)+ GetArr :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> ArrCMD (Param3 prog exp pred) (Val a)+ SetArr :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> exp a -> ArrCMD (Param3 prog exp pred) ()+ CopyArr :: (pred a, Integral i, Ix i) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ArrCMD (Param3 prog exp pred) () -- The arrays are paired with their offset UnsafeFreezeArr :: (pred a, Integral i, Ix i) => Arr i a -> ArrCMD (Param3 prog exp pred) (IArr i a) UnsafeThawArr :: (pred a, Integral i, Ix i) => IArr i a -> ArrCMD (Param3 prog exp pred) (Arr i a)@@ -199,7 +199,7 @@ instance HFunctor ArrCMD where hfmap _ (NewArr base n) = NewArr base n- hfmap _ (InitArr base as) = InitArr base as+ hfmap _ (ConstArr base as) = ConstArr base as hfmap _ (GetArr i arr) = GetArr i arr hfmap _ (SetArr i a arr) = SetArr i a arr hfmap _ (CopyArr a1 a2 l) = CopyArr a1 a2 l@@ -209,9 +209,9 @@ instance HBifunctor ArrCMD where hbimap _ f (NewArr base n) = NewArr base (f n)- hbimap _ _ (InitArr base as) = InitArr base as- hbimap _ f (GetArr i arr) = GetArr (f i) arr- hbimap _ f (SetArr i a arr) = SetArr (f i) (f a) arr+ hbimap _ _ (ConstArr base as) = ConstArr base as+ hbimap _ f (GetArr arr i) = GetArr arr (f i)+ hbimap _ f (SetArr arr i a) = SetArr arr (f i) (f a) hbimap _ f (CopyArr (a1,o1) (a2,o2) l) = CopyArr (a1, f o1) (a2, f o2) (f l) hbimap _ _ (UnsafeFreezeArr arr) = UnsafeFreezeArr arr hbimap _ _ (UnsafeThawArr arr) = UnsafeThawArr arr@@ -219,9 +219,9 @@ instance (ArrCMD :<: instr) => Reexpressible ArrCMD instr env where reexpressInstrEnv reexp (NewArr base n) = lift . singleInj . NewArr base =<< reexp n- reexpressInstrEnv reexp (InitArr base as) = lift $ singleInj $ InitArr base as- reexpressInstrEnv reexp (GetArr i arr) = lift . singleInj . flip GetArr arr =<< reexp i- reexpressInstrEnv reexp (SetArr i a arr) = do i' <- reexp i; a' <- reexp a; lift $ singleInj $ SetArr i' a' arr+ reexpressInstrEnv reexp (ConstArr base as) = lift $ singleInj $ ConstArr base as+ reexpressInstrEnv reexp (GetArr arr i) = lift . singleInj . GetArr arr =<< reexp i+ reexpressInstrEnv reexp (SetArr arr i a) = do i' <- reexp i; a' <- reexp a; lift $ singleInj $ SetArr arr i' a' reexpressInstrEnv reexp (UnsafeFreezeArr arr) = lift $ singleInj $ UnsafeFreezeArr arr reexpressInstrEnv reexp (UnsafeThawArr arr) = lift $ singleInj $ UnsafeThawArr arr reexpressInstrEnv reexp (CopyArr (a1,o1) (a2,o2) l) = do@@ -232,11 +232,11 @@ instance DryInterp ArrCMD where- dryInterp (NewArr base _) = liftM ArrComp $ freshStr base- dryInterp (InitArr base _) = liftM ArrComp $ freshStr base- dryInterp (GetArr _ _) = liftM ValComp $ freshStr "v"- dryInterp (SetArr _ _ _) = return ()- dryInterp (CopyArr _ _ _) = return ()+ dryInterp (NewArr base _) = liftM ArrComp $ freshStr base+ dryInterp (ConstArr base _) = liftM ArrComp $ freshStr base+ dryInterp (GetArr _ _) = liftM ValComp $ freshStr "v"+ dryInterp (SetArr _ _ _) = return ()+ dryInterp (CopyArr _ _ _) = return () dryInterp (UnsafeFreezeArr (ArrComp arr)) = return (IArrComp arr) dryInterp (UnsafeThawArr (IArrComp arr)) = return (ArrComp arr) @@ -347,6 +347,10 @@ writeIORef arr1 arr2' writeIORef arr2 arr1' +instance IsPointer (Ptr a)+ where+ runSwapPtr = error "cannot run SwapPtr for Ptr"+ data PtrCMD fs a where SwapPtr :: IsPointer a => a -> a -> PtrCMD (Param3 prog exp pred) ()@@ -372,7 +376,7 @@ data Handle = HandleComp VarId | HandleRun IO.Handle- deriving Typeable+ deriving (Eq, Show, Typeable) instance ToIdent Handle where toIdent (HandleComp h) = C.Id h @@ -489,7 +493,7 @@ , objectType :: String , objectId :: VarId }- deriving (Eq, Show, Ord, Typeable)+ deriving (Eq, Show, Typeable) instance ToIdent Object where toIdent (Object _ _ o) = C.Id o @@ -569,10 +573,10 @@ data C_CMD fs a where- NewCArr :: (pred a, Integral i, Ix i) => String -> Maybe i -> exp i -> C_CMD (Param3 prog exp pred) (Arr i a)- InitCArr :: (pred a, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)- NewPtr :: pred a => String -> C_CMD (Param3 prog exp pred) (Ptr a)- PtrToArr :: Ptr a -> C_CMD (Param3 prog exp pred) (Arr i a)+ NewCArr :: (pred a, Integral i, Ix i) => String -> Maybe i -> exp i -> C_CMD (Param3 prog exp pred) (Arr i a)+ ConstCArr :: (pred a, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)+ NewPtr :: pred a => String -> C_CMD (Param3 prog exp pred) (Ptr a)+ PtrToArr :: Ptr a -> C_CMD (Param3 prog exp pred) (Arr i a) NewObject :: String -- Base name -> String -- Type@@ -589,7 +593,7 @@ instance HFunctor C_CMD where hfmap _ (NewCArr base al n) = NewCArr base al n- hfmap _ (InitCArr base al as) = InitCArr base al as+ hfmap _ (ConstCArr base al as) = ConstCArr base al as hfmap _ (NewPtr base) = NewPtr base hfmap _ (PtrToArr p) = PtrToArr p hfmap _ (NewObject base p t) = NewObject base p t@@ -604,7 +608,7 @@ instance HBifunctor C_CMD where hbimap _ f (NewCArr base al n) = NewCArr base al (f n)- hbimap _ _ (InitCArr base al as) = InitCArr base al as+ hbimap _ _ (ConstCArr base al as) = ConstCArr base al as hbimap _ _ (NewPtr base) = NewPtr base hbimap _ _ (PtrToArr p) = PtrToArr p hbimap _ _ (NewObject base p t) = NewObject base p t@@ -619,7 +623,7 @@ instance (C_CMD :<: instr) => Reexpressible C_CMD instr env where reexpressInstrEnv reexp (NewCArr base al n) = lift . singleInj . NewCArr base al =<< reexp n- reexpressInstrEnv reexp (InitCArr base al as) = lift $ singleInj $ InitCArr base al as+ reexpressInstrEnv reexp (ConstCArr base al as) = lift $ singleInj $ ConstCArr base al as reexpressInstrEnv reexp (NewPtr base) = lift $ singleInj $ NewPtr base reexpressInstrEnv reexp (PtrToArr p) = lift $ singleInj $ PtrToArr p reexpressInstrEnv reexp (NewObject base p t) = lift $ singleInj $ NewObject base p t@@ -634,7 +638,7 @@ instance DryInterp C_CMD where dryInterp (NewCArr base _ _) = liftM ArrComp $ freshStr base- dryInterp (InitCArr base _ _) = liftM ArrComp $ freshStr base+ dryInterp (ConstCArr base _ _) = liftM ArrComp $ freshStr base dryInterp (NewPtr base) = liftM PtrComp $ freshStr base dryInterp (PtrToArr (PtrComp p)) = return $ ArrComp p dryInterp (NewObject base t p) = liftM (Object p t) $ freshStr base@@ -664,9 +668,9 @@ n' <- n arr <- newArray_ (0, fromIntegral n'-1) ArrRun <$> newIORef arr-runArrCMD (InitArr _ as) =+runArrCMD (ConstArr _ as) = fmap ArrRun . newIORef =<< newListArray (0, genericLength as - 1) as-runArrCMD (GetArr i (ArrRun arr)) = do+runArrCMD (GetArr (ArrRun arr) i) = do arr' <- readIORef arr i' <- i (l,h) <- getBounds arr'@@ -676,7 +680,7 @@ ++ " out of bounds " ++ show (toInteger l, toInteger h) else ValRun <$> readArray arr' i'-runArrCMD (SetArr i a (ArrRun arr)) = do+runArrCMD (SetArr (ArrRun arr) i a) = do arr' <- readIORef arr i' <- i a' <- a@@ -784,18 +788,18 @@ runFileCMD (FEof h) = fmap ValRun $ IO.hIsEOF $ runHandle h runC_CMD :: forall pred a. C_CMD (Param3 IO IO pred) a -> IO a-runC_CMD (NewCArr base _ n) = runArrCMD (NewArr base n :: ArrCMD (Param3 IO IO pred) a)-runC_CMD (InitCArr base _ as) = runArrCMD (InitArr base as :: ArrCMD (Param3 IO IO pred) a)-runC_CMD (NewPtr base) = error $ "cannot run programs involving newPtr (base name " ++ base ++ ")"-runC_CMD (PtrToArr p) = error "cannot run programs involving ptrToArr"-runC_CMD (NewObject base _ _) = error $ "cannot run programs involving newObject (base name " ++ base ++ ")"-runC_CMD (AddInclude _) = return ()-runC_CMD (AddDefinition _) = return ()-runC_CMD (AddExternFun _ _ _) = return ()-runC_CMD (AddExternProc _ _) = return ()-runC_CMD (CallFun _ _) = error "cannot run programs involving callFun"-runC_CMD (CallProc _ _ _) = error "cannot run programs involving callProc"-runC_CMD (InModule _ prog) = prog+runC_CMD (NewCArr base _ n) = runArrCMD (NewArr base n :: ArrCMD (Param3 IO IO pred) a)+runC_CMD (ConstCArr base _ as) = runArrCMD (ConstArr base as :: ArrCMD (Param3 IO IO pred) a)+runC_CMD (NewPtr base) = error $ "cannot run programs involving newPtr (base name " ++ base ++ ")"+runC_CMD (PtrToArr p) = error "cannot run programs involving ptrToArr"+runC_CMD (NewObject base _ _) = error $ "cannot run programs involving newObject (base name " ++ base ++ ")"+runC_CMD (AddInclude _) = return ()+runC_CMD (AddDefinition _) = return ()+runC_CMD (AddExternFun _ _ _) = return ()+runC_CMD (AddExternProc _ _) = return ()+runC_CMD (CallFun _ _) = error "cannot run programs involving callFun"+runC_CMD (CallProc _ _ _) = error "cannot run programs involving callProc"+runC_CMD (InModule _ prog) = prog instance InterpBi RefCMD IO (Param1 pred) where interpBi = runRefCMD instance InterpBi ArrCMD IO (Param1 pred) where interpBi = runArrCMD
src/Language/Embedded/Imperative/Frontend.hs view
@@ -115,21 +115,21 @@ -> ProgramT instr (Param2 exp pred) m (Arr i a) newNamedArr base len = singleInj (NewArr base len) --- | Create and initialize an array-initArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+-- | Create an array and initialize it with a constant list+constArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => [a] -- ^ Initial contents -> ProgramT instr (Param2 exp pred) m (Arr i a)-initArr = initNamedArr "a"+constArr = constNamedArr "a" --- | Create and initialize a named array+-- | Create a named array and initialize it with a constant list -- -- The provided base name may be appended with a unique identifier to avoid name -- collisions.-initNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+constNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => String -- ^ Base name -> [a] -- ^ Initial contents -> ProgramT instr (Param2 exp pred) m (Arr i a)-initNamedArr base init = singleInj (InitArr base init)+constNamedArr base init = singleInj (ConstArr base init) -- | Get an element of an array getArr@@ -141,13 +141,13 @@ , ArrCMD :<: instr , Monad m )- => exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp a)-getArr i arr = fmap valToExp $ singleInj $ GetArr i arr+ => Arr i a -> exp i -> ProgramT instr (Param2 exp pred) m (exp a)+getArr arr i = fmap valToExp $ singleInj $ GetArr arr i -- | Set an element of an array setArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) =>- exp i -> exp a -> Arr i a -> ProgramT instr (Param2 exp pred) m ()-setArr i a arr = singleInj (SetArr i a arr)+ Arr i a -> exp i -> exp a -> ProgramT instr (Param2 exp pred) m ()+setArr arr i a = singleInj (SetArr arr i a) -- | Copy the contents of an array to another array. The number of elements to -- copy must not be greater than the number of allocated elements in either@@ -195,11 +195,6 @@ unsafeThawArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => IArr i a -> ProgramT instr (Param2 exp pred) m (Arr i a) unsafeThawArr arr = singleInj $ UnsafeThawArr arr---- | Create and initialize an immutable array-initIArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr, Monad m) =>- [a] -> ProgramT instr (Param2 exp pred) m (IArr i a)-initIArr = unsafeFreezeArr <=< initArr
tests/Imperative.hs view
@@ -87,85 +87,85 @@ testCopyArr1 = do arr1 :: Arr Word32 Int32 <- newArr (10 :: CExp Word32) arr2 :: Arr Word32 Int32 <- newArr (10 :: CExp Word32)- sequence_ [setArr i (i2n i+10) arr1 | i' <- [0..9], let i = fromInteger i']+ sequence_ [setArr arr1 i (i2n i+10) | i' <- [0..9], let i = fromInteger i'] copyArr (arr2,0) (arr1,0) 10- sequence_ [getArr i arr2 >>= printf "%d " . (*3) | i' <- [0..9], let i = fromInteger i']+ sequence_ [getArr arr2 i >>= printf "%d " . (*3) | i' <- [0..9], let i = fromInteger i'] printf "\n" testCopyArr2 :: Prog () testCopyArr2 = do arr1 :: Arr Word32 Int32 <- newArr (20 :: CExp Word32) arr2 :: Arr Word32 Int32 <- newArr (20 :: CExp Word32)- sequence_ [setArr i (i2n i+10) arr1 | i' <- [0..19], let i = fromInteger i']+ sequence_ [setArr arr1 i (i2n i+10) | i' <- [0..19], let i = fromInteger i'] copyArr (arr2,10) (arr1,5) 10- sequence_ [getArr i arr2 >>= printf "%d " . (*3) | i' <- [10..19], let i = fromInteger i']+ sequence_ [getArr arr2 i >>= printf "%d " . (*3) | i' <- [10..19], let i = fromInteger i'] printf "\n" testArr2 :: Prog () testArr2 = do n <- fget stdin arr :: Arr Word32 Int32 <- newArr n -- Array of dynamic length- sequence_ [setArr (i2n i) i arr | i' <- [0..3], let i = fromInteger i']- sequence_ [getArr i arr >>= printf "%d " . (*3) | i' <- [0..3], let i = fromInteger i']+ sequence_ [setArr arr (i2n i) i | i' <- [0..3], let i = fromInteger i']+ sequence_ [getArr arr i >>= printf "%d " . (*3) | i' <- [0..3], let i = fromInteger i'] printf "\n" return () testArr3 :: Prog () testArr3 = do- arr :: Arr Word32 Int32 <- initArr [8,7,6,5]- sequence_ [getArr i arr >>= printf "%d " . (*3) | i' <- [0..3], let i = fromInteger i']+ arr :: Arr Word32 Int32 <- constArr [8,7,6,5]+ sequence_ [getArr arr i >>= printf "%d " . (*3) | i' <- [0..3], let i = fromInteger i'] printf "\n" return () testArr4 :: Prog () testArr4 = do- arr :: Arr Word32 Int32 <- initArr [8,7,6,5]+ arr :: Arr Word32 Int32 <- constArr [8,7,6,5] iarr <- freezeArr arr 4 sequence_ [printf "%d " $ iarr #! i | i' <- [0..3], let i = fromInteger i'] printf "\n" testArr5 :: Prog () testArr5 = do- arr :: Arr Word32 Int32 <- initArr [8,7,6,5]+ arr :: Arr Word32 Int32 <- constArr [8,7,6,5] iarr <- unsafeFreezeArr arr sequence_ [printf "%d " $ iarr #! i | i' <- [0..3], let i = fromInteger i'] printf "\n" testArr6 :: Prog () testArr6 = do- arr :: Arr Word32 Int32 <- initArr [8,7,6,5]+ arr :: Arr Word32 Int32 <- constArr [8,7,6,5] iarr <- unsafeFreezeArr arr arr2 <- unsafeThawArr iarr- sequence_ [getArr i arr2 >>= printf "%d " | i <- map fromInteger [0..3]]+ sequence_ [getArr arr2 i >>= printf "%d " | i <- map fromInteger [0..3]] printf "\n" testArr7 :: Prog () testArr7 = do- arr :: Arr Word32 Int32 <- initArr [8,7,6,5]+ arr :: Arr Word32 Int32 <- constArr [8,7,6,5] iarr <- freezeArr arr 4 arr2 <- thawArr iarr 4- sequence_ [getArr i arr2 >>= printf "%d " | i <- map fromInteger [0..3]]+ sequence_ [getArr arr2 i >>= printf "%d " | i <- map fromInteger [0..3]] printf "\n" testSwap1 :: Prog () testSwap1 = do- arr1 :: Arr Word32 Int32 <- initArr [1,2,3,4]- arr2 :: Arr Word32 Int32 <- initArr [11,12,13,14]+ arr1 :: Arr Word32 Int32 <- constArr [1,2,3,4]+ arr2 :: Arr Word32 Int32 <- constArr [11,12,13,14] unsafeSwap arr1 arr2- sequence_ [getArr i arr1 >>= printf "%d " | i <- map fromInteger [0..3]]+ sequence_ [getArr arr1 i >>= printf "%d " | i <- map fromInteger [0..3]] printf "\n" testSwap2 :: Prog () testSwap2 = do- arr1 :: Arr Word32 Int32 <- initArr [1,2,3,4]+ arr1 :: Arr Word32 Int32 <- constArr [1,2,3,4] n <- fget stdin arr2 :: Arr Word32 Int32 <- newArr n copyArr (arr2,0) (arr1,0) 4- setArr 2 22 arr2+ setArr arr2 2 22 unsafeSwap arr1 arr2- sequence_ [getArr i arr1 >>= printf "%d " | i <- map fromInteger [0..3]]+ sequence_ [getArr arr1 i >>= printf "%d " | i <- map fromInteger [0..3]] printf "\n"- sequence_ [getArr i arr2 >>= printf "%d " | i <- map fromInteger [0..3]]+ sequence_ [getArr arr2 i >>= printf "%d " | i <- map fromInteger [0..3]] printf "\n" testIf1 :: Prog ()@@ -222,7 +222,7 @@ addInclude "<stdio.h>" p :: Ptr Int32 <- newPtr callProcAssign p "malloc" [valArg (100 :: CExp Word32)]- arr :: Arr Word32 Int32 <- initArr [34,45,56,67,78]+ arr :: Arr Word32 Int32 <- constArr [34,45,56,67,78] callProc "memcpy" [ptrArg p, arrArg arr, valArg (5*4 :: CExp Word32)] -- sizeof(int32_t) = 4 callProc "printf" [strArg "%d\n", deref $ ptrArg p] iarr :: IArr Word32 Int32 <- unsafeFreezeArr =<< ptrToArr p@@ -237,7 +237,7 @@ addDefinition ret_def let v = 55 :: CExp Int32 r <- initRef (66 :: CExp Int32)- a :: Arr Int32 Int32 <- initArr [234..300]+ a :: Arr Int32 Int32 <- constArr [234..300] ia <- freezeArr a 10 p :: Ptr Int32 <- newPtr o <- newObject "int" False