Changeset 15374
- Timestamp:
- 02/28/07 00:25:27 (21 months ago)
- Location:
- src
- Files:
-
- 13 modified
-
MO/Base.hs (modified) (4 diffs)
-
MO/Compile.hs (modified) (1 diff)
-
Pugs/AST.hs (modified) (1 diff)
-
Pugs/AST/Eval.hs (modified) (5 diffs)
-
Pugs/AST/Internals.hs (modified) (10 diffs)
-
Pugs/AST/SIO.hs (modified) (1 diff)
-
Pugs/Class.hs (modified) (3 diffs)
-
Pugs/Eval/Var.hs (modified) (1 diff)
-
Pugs/Exp.hs (modified) (1 diff)
-
Pugs/Val.hs (modified) (5 diffs)
-
Pugs/Val.hs-boot (modified) (2 diffs)
-
Pugs/Val/Base.hs (modified) (2 diffs)
-
Pugs/Val/Code.hs (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/MO/Base.hs
r14697 r15374 5 5 import Data.Maybe 6 6 import Data.Typeable 7 import MO.Util8 9 7 10 8 -- | open type to represent Code 11 class Monad m => Code m c where9 class Monad m => Codeable m c where 12 10 run :: c -> Arguments m -> m (Invocant m) 13 11 … … 15 13 newtype NoCode m = NoCode (Invocant m) 16 14 17 instance (Typeable (NoCode m), Monad m) => Code m (NoCode m) where15 instance (Typeable (NoCode m), Monad m) => Codeable m (NoCode m) where 18 16 run (NoCode obj) _ = return obj 19 17 instance Show (NoCode m) where … … 23 21 newtype PureCode = PureCode (forall m. (Typeable1 m, Monad m) => Arguments m -> Invocant m) 24 22 25 instance (Typeable1 m, Monad m) => Code m PureCode where23 instance (Typeable1 m, Monad m) => Codeable m PureCode where 26 24 run (PureCode f) a = return (f a) 27 25 instance Show PureCode where … … 31 29 newtype Monad m => HsCode m = HsCode (Arguments m -> m (Invocant m)) 32 30 33 instance (Typeable1 m, Monad m) => Code m (HsCode m) where31 instance (Typeable1 m, Monad m) => Codeable m (HsCode m) where 34 32 run (HsCode f) a = f a 35 33 instance Show (HsCode m) where -
src/MO/Compile.hs
r14723 r15374 42 42 43 43 data MethodCompiled m 44 = forall c. Code m c => MkMethodCompiled c44 = forall c. Codeable m c => MkMethodCompiled c 45 45 46 -- NOTE: Maybe I should instantiate MethodCompiled for Code ? :P46 -- NOTE: Maybe I should instantiate MethodCompiled for Codeable? :P 47 47 runMC :: MethodCompiled m -> Arguments m -> m (Invocant m) 48 48 runMC (MkMethodCompiled c) = run c -
src/Pugs/AST.hs
r15297 r15374 39 39 import Pugs.AST.SIO 40 40 import Pugs.AST.Pad 41 import Pugs.Val (val, castVal, formatVal, PureBit, PureBool, PureStr, PureInt, PureNum, Capt(..), ValCapt, Feed(..), ValFeed, emptyFeed, Sig(..), SigParam(..), ParamAccess(..), ParamDefault(..))41 import Pugs.Val hiding (Val, Param, listVal) -- (val, castVal, formatVal, PureBit, PureBool, PureStr, PureInt, PureNum, Capt(..), ValCapt, Feed(..), ValFeed, emptyFeed, Sig(..), SigParam(..), ParamAccess(..), ParamDefault(..)) 42 42 43 43 {-| -
src/Pugs/AST/Eval.hs
r15297 r15374 10 10 11 11 {- Eval Monad -} 12 type Eval = EvalT (ReaderT Env SIO) 13 newtype EvalT m a = EvalT { runEvalT :: ContT (EvalResult Val) m (EvalResult a) } 12 13 newtype Eval a = EvalT { runEvalT :: ContT (EvalResult Val) (ReaderT Env SIO) (EvalResult a) } 14 deriving (Typeable) 14 15 15 16 data EvalResult a … … 31 32 32 33 tryIO :: a -> IO a -> Eval a 33 tryIO err = lift . liftIO . (`catchIO` (const $ return err))34 tryIO err = liftEval . liftIO . (`catchIO` (const $ return err)) 34 35 35 36 {-| … … 116 117 strMsg = errStr 117 118 119 liftEval m = EvalT $ do 120 a <- ContT (m >>=) 121 return (RNormal a) 122 123 {- 118 124 instance MonadTrans EvalT where 119 125 lift m = EvalT $ do 120 126 a <- ContT (m >>=) 121 127 return (RNormal a) 128 -} 122 129 123 130 instance Functor Eval where … … 129 136 130 137 instance MonadIO Eval where 131 liftIO = lift . liftIO138 liftIO = liftEval . liftIO 132 139 133 140 instance MonadError Val Eval where … … 185 192 186 193 instance MonadReader Env Eval where 187 ask = lift ask194 ask = liftEval ask 188 195 local f m = EvalT $ local f (runEvalT m) 189 196 -
src/Pugs/AST/Internals.hs
r15297 r15374 2 2 3 3 module Pugs.AST.Internals ( 4 Eval , -- uses Val, Env, SIO4 Eval(..), -- uses Val, Env, SIO 5 5 Ann(..), -- Cxt, Pos, Prag 6 6 Exp(..), -- uses Pad, Eval, Val … … 9 9 Value(..), -- uses Val, Eval 10 10 InitDat(..), 11 12 EvalT(..), SubAssoc(..), 11 SubAssoc(..), 13 12 14 13 Pad(..), PadEntry(..), PadMutator, -- uses Var, TVar, VRef … … 216 215 fromVV :: Val.Val -> Eval n 217 216 fromVV v = do 218 str <- liftSIO (Val.asStr v)217 str <- Val.asStr v 219 218 fail $ "Cannot cast from VV (" ++ cast str ++ ") to " ++ errType (undefined :: n) 220 219 toVV :: n -> Eval Val … … 249 248 250 249 toVV' :: Val -> Eval Val 251 toVV' VUndef = return $ VV $ Val.val $ Val.VUndef $ Val.UUndef252 toVV' (VBool v) = return $ VV $ Val.val $ ((cast v) :: Val.PureBit)250 toVV' VUndef = return $ VV $ Val.val $ () 251 toVV' (VBool v)= return $ VV $ Val.val $ ((cast v) :: Val.PureBit) 253 252 toVV' (VInt v) = return $ VV $ Val.val $ ((cast v) :: Val.PureInt) 254 253 toVV' (VNum v) = return $ VV $ Val.val $ ((cast v) :: Val.PureNum) … … 419 418 castV = VBool 420 419 fromSV sv = liftIO $ svToVBool sv 421 fromVV vv = liftSIO $fmap cast (Val.asBit vv)420 fromVV vv = fmap cast (Val.asBit vv) 422 421 doCast (VJunc j) = juncToBool j 423 422 doCast (VMatch m) = return $ matchOk m … … 436 435 instance Value VInt where 437 436 castV = VInt 438 fromVV vv = liftSIO $fmap cast (Val.asInt vv)437 fromVV vv = fmap cast (Val.asInt vv) 439 438 fromSV sv = liftIO $ svToVInt sv 440 439 doCast (VInt i) = return $ i … … 464 463 instance Value VNum where 465 464 castV = VNum 466 fromVV vv = liftSIO $fmap cast (Val.asNum vv)465 fromVV vv = fmap cast (Val.asNum vv) 467 466 fromSV sv = liftIO $ svToVNum sv 468 467 doCast VUndef = return $ 0 … … 514 513 castV = VStr . cast 515 514 fromSV sv = fmap cast (liftIO $ svToVStr sv) 516 fromVV vv = liftSIO $cast (Val.asStr vv)515 fromVV vv = cast (Val.asStr vv) 517 516 fromVal = fmap (cast :: VStr -> ID) . fromVal 518 517 doCast = fmap (cast :: VStr -> ID) . doCast … … 521 520 castV = VStr 522 521 fromSV sv = liftIO $ svToVStr sv 523 fromVV vv = liftSIO $cast (Val.asStr vv)522 fromVV vv = cast (Val.asStr vv) 524 523 fromVal (VList l) = return . unwords =<< mapM fromVal l 525 524 fromVal v@(PerlSV _) = fromVal' v … … 1925 1924 instance Typeable VRef where 1926 1925 typeOf (MkRef x) = typeOf x 1927 1928 instance Typeable1 (EvalT (ReaderT Env SIO)) where1929 typeOf1 _ = typeOf ()1930 1926 1931 1927 instance Typeable1 IVar where -
src/Pugs/AST/SIO.hs
r12324 r15374 17 17 18 18 data SIO a = MkSTM !(STM a) | MkIO !(IO a) | MkSIO !a 19 deriving (Typeable) 19 20 20 21 {-# INLINE runSIO #-} -
src/Pugs/Class.hs
r15373 r15374 26 26 27 27 class (Typeable a, Ord a, Typeable1 m, Monad m) => Boxable m a | a -> m where 28 classOfBox :: a -> MI m 29 fromObjBox :: Invocant m -> m a 28 classOf :: a -> MI m 29 classOf o = mkBoxClass ty ([] :: [(String, String -> m (Invocant m))]) 30 where 31 ty = takeTypeName "" . reverse . show $ typeOf o 32 -- Here we intuit "Str" from "Pugs.Val.Str.PureStr". 33 takeTypeName acc [] = acc 34 takeTypeName acc (x:xs) 35 | isLower x = takeTypeName (x:acc) xs 36 | otherwise = x:acc 37 38 fromObj :: Invocant m -> m a 39 fromObj (MkInvocant x _) = fromTypeable x 30 40 31 41 (...) :: forall t a b (m :: * -> *). (Show b, Boxable m b) => t -> (a -> b) -> (t, a -> m (Invocant m)) … … 36 46 37 47 mkObj :: (Show a, Boxable m a) => a -> m (Invocant m) 38 mkObj x = return $ MkInvocant x (class_interface (classOf Boxx))48 mkObj x = return $ MkInvocant x (class_interface (classOf x)) 39 49 40 50 mkObjM :: (Show a, Boxable m a) => m a -> m (Invocant m) 41 51 mkObjM x = do 42 52 x' <- x 43 return $ MkInvocant x' (class_interface (classOf Boxx'))53 return $ MkInvocant x' (class_interface (classOf x')) 44 54 45 55 mkBoxClass :: forall t (m :: * -> *) (m1 :: * -> *). 46 56 ( Method m1 (AnyMethod m1) 47 , Code m1 (HsCode m)57 , Codeable m1 (HsCode m) 48 58 , Typeable t 49 59 , Typeable1 m … … 63 73 mkBoxMethod :: forall t (m1 :: * -> *) (m :: * -> *). 64 74 ( Method m (SimpleMethod m) 65 , Code m (HsCode m1)75 , Codeable m (HsCode m1) 66 76 , Typeable t 67 77 , Typeable1 m1 -
src/Pugs/Eval/Var.hs
r15373 r15374 237 237 -- callMethod methName [] 238 238 -- inv ./ meth = ivDispatch inv $ MkMethodInvocation meth (mkArgs []) 239 case invVV of 240 Val.VPure p -> return . runIdentity $ do 241 obj <- mkObj p 242 res <- fromObjBox =<< obj ./ cast methName 243 return . castV $ Val.VPure (res `asTypeOf` p) 244 _ -> do 245 return . castV $ "CCall " ++ show methName ++ " " ++ show capt 239 resVV <- invVV ./ cast methName 240 return . castV $ resVV 246 241 } 247 242 -
src/Pugs/Exp.hs
r13496 r15374 11 11 import Pugs.Internals 12 12 import Pugs.Val 13 import Pugs.Types (Var) 13 14 import qualified Pugs.AST.Internals (Exp) 14 15 -
src/Pugs/Val.hs
r15297 r15374 1 1 {-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances -fallow-overlapping-instances -fno-warn-missing-methods -cpp #-} 2 {-! global : YAML_Pos, Perl6Class, MooseClass !-}3 2 {-| 4 3 Perl 6 Values. … … 9 8 > And shining spears were laid in hoard... 10 9 -} 10 11 module Pugs.Val ( 12 module Pugs.Val, 13 module Pugs.Val.Code, 14 ) where 15 import Pugs.Class 16 import Pugs.AST.Eval 17 import Pugs.Val.Code 18 import Pugs.Internals 19 import Text.PrettyPrint 20 import qualified Data.ByteString.Char8 as Str 21 22 type Val = Invocant Eval 23 24 asStr :: Val -> Eval PureStr 25 asStr (MkInvocant x _) = return (cast (show x)) 26 asBit :: Val -> Eval PureBit 27 asBit _ = return (cast True) 28 asInt :: Val -> Eval PureInt 29 asInt _ = return (cast (0 :: Int)) 30 asNum :: Val -> Eval PureNum 31 asNum _ = return (cast (0 :: Double)) 32 listVal :: Val -> Eval PureList 33 listVal = return . (:[]) 34 itemVal :: Val -> Eval Val 35 itemVal = return 36 37 valMeta :: Val -> PureStr 38 valMeta _ = cast "Object" 39 40 valShow :: Val -> PureStr 41 valShow = cast "<opaque>" 42 43 val :: (Show a, Boxable m a) => a -> (Invocant m) 44 val x = MkInvocant x (class_interface (classOf x)) 45 46 formatVal :: Val -> Doc 47 formatVal (MkInvocant x _) = text (show x) 48 49 castVal :: forall a m . (Monad m, Typeable a) => Val -> m a 50 castVal (MkInvocant v _) = fromTypeable v 51 52 instance ((:>:) PureNum) Rational where cast = NRational 53 instance ((:<:) PureNum) Rational where 54 castBack (NDouble x) = toRational x 55 castBack (NRational x) = x 56 instance ((:>:) PureNum) Double where cast = NDouble 57 instance ((:<:) PureNum) Double where 58 castBack (NDouble x) = x 59 castBack (NRational x) = fromRational x 60 61 instance ((:>:) PureInt) Integer where cast = IFinite 62 instance ((:<:) PureInt) Integer where 63 castBack (IFinite i) = i 64 castBack INotANumber = error "NaN" 65 castBack (IInfinite SPositive) = error "+Infinity" 66 castBack (IInfinite SNegative) = error "-Infinity" 67 68 instance ((:>:) PureInt) Int where cast = IFinite . toInteger 69 instance ((:<:) PureInt) Int where 70 castBack (IFinite i) = fromInteger i 71 castBack INotANumber = error "NaN" 72 castBack (IInfinite SPositive) = error "+Infinity" 73 castBack (IInfinite SNegative) = error "-Infinity" 74 type PureList = [Val] -- Seq (Either PureSeq PureRange) -- XXX - *very bogus* 75 76 newtype PureBit = MkBit Bool 77 deriving (Typeable, Show, Eq, Ord, Data, (:>:) Bool, (:<:) Bool) 78 79 newtype PureStr = MkStr { unStr :: ByteString } deriving 80 ( Typeable, Show, Eq, Ord, Data 81 , (:>:) ID, (:<:) ID 82 , (:>:) String, (:<:) String 83 , (:>:) ByteString, (:<:) ByteString 84 ) 85 86 data PureInt 87 = IFinite !Integer 88 | IInfinite !Sign 89 | INotANumber 90 deriving (Typeable, Show, Eq, Ord, Data) 91 92 data PureNum 93 = NDouble !Double -- change to "!NativeDouble" 94 | NRational !Rational 95 deriving (Typeable, Show, Eq, Ord, Data) 96 97 data Sign 98 = SPositive 99 | SNegative 100 deriving (Show, Eq, Ord, Data, Typeable) 101 102 instance Boxable Eval () 103 instance Boxable Eval PureInt 104 instance Boxable Eval PureNum 105 instance Boxable Eval PureSig 106 instance Boxable Eval PureBit 107 instance Boxable Eval ValCapt 108 109 instance Boxable Eval PureStr where 110 classOf _ = mkBoxClass "Str" 111 [ "reverse" ... (MkStr . Str.reverse . unStr) 112 ] 113 114 {- 11 115 module Pugs.Val ( 12 116 IValue(..), Val(..), ValUndef(..), ValNative, P, … … 22 126 ) where 23 127 import Pugs.Internals 128 import Pugs.Class 24 129 import GHC.Exts 25 130 import Data.Generics.Basics hiding (cast) … … 241 346 instance ICoercible SIO a => Ext a where {} 242 347 243 type Class = PureStr -- XXX - Wrong348 -- type Class = PureStr -- XXX - Wrong 244 349 245 350 dynEq :: (Typeable a, Typeable b, Eq a) => a -> b -> Bool … … 499 604 compare (VExt aa) (VExt aa') = dynCompare aa aa' 500 605 606 607 -} -
src/Pugs/Val.hs-boot
r15096 r15374 2 2 3 3 module Pugs.Val where 4 import Pugs.Class 5 import Pugs.AST.Eval 4 6 5 import Pugs.Types (Var(..)) 6 import Pugs.Internals 7 import qualified Data.ByteString as Buf 7 type Val = Invocant Eval 8 8 9 data Val 9 {- 10 newtype Pad = MkPad { padEntries :: Map Var PadEntry } 11 type Table = Map ID Val 12 data PadEntry 13 14 instance Show Pad 15 instance Show Val 16 10 17 data ValNative 11 18 = NBit !NativeBit … … 25 32 type P = Identity 26 33 instance Typeable1 P 27 type Table = Map ID Val28 newtype Pad = MkPad { padEntries :: Map Var PadEntry }29 data PadEntry30 34 --data Stmt 35 -} -
src/Pugs/Val/Base.hs
r15373 r15374 8 8 import Pugs.Class 9 9 import {-# SOURCE #-} Pugs.Val 10 11 {- 10 12 11 13 … … 136 138 ] 137 139 140 141 -} -
src/Pugs/Val/Code.hs
r15297 r15374 1 {- 2 - {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} 1 {-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances -fallow-overlapping-instances -fno-warn-missing-methods #-} 3 2 module Pugs.Val.Code where 4 3 import Pugs.Internals 5 4 import Pugs.Types 6 5 import Data.Monoid 6 import qualified Data.Map as Map 7 import qualified Data.Set as Set 8 import qualified Pugs.Types as Types 9 10 import {-# SOURCE #-} Pugs.Exp 7 11 import {-# SOURCE #-} Pugs.Val 8 --import {-# SOURCE #-} Pugs.Val.Sig 9 -} 10 12 13 14 type Code = () 15 type Table = Map ID Val 16 17 {- 11 18 -- | AST for a primitive Code object 12 19 data Code … … 58 65 59 66 -------------------------------------------------------------------------------------- 67 -} 60 68 61 69 -- | AST for function signature. Separated to method and function variants … … 139 147 deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos, Perl6Class, MooseClass!-} 140 148 149 {- 141 150 instance ICoercible P Sig where 142 151 asStr = return . cast . render . purePretty 143 152 144 153 instance Pure Sig where 145 purePretty s = colon <> (parens $ prettySig s) 146 154 -} 155 {- 156 purePretty s = colon <> (parens $ prettySig s) 157 147 158 prettySig :: Sig -> Doc 148 159 prettySig s@(SigMethSingle {}) = invocant <> colon `invSpace` (prettySubSig s) … … 188 199 debugDump = if True then empty else braces $ text $ show p -- XXX delme 189 200 -------------------------------------------------------------------------------------- 201 -} 190 202 191 203 -- | a Capture is a frozen version of the arguments to an application. … … 222 234 type ValFeed = Feed Val 223 235 224 instance ICoercible P ValCapt where225 asStr _ = return (cast "<capt>") -- XXX226
