{-# OPTIONS_GHC -fglasgow-exts #-} module PIL.Pad (Pad, Sym(..), Sigil(..), Twigil, mkSym, unSigil) where import PIL.Container import PIL.Internals -- Pad maps symbols to containers newtype Pad = MkPad (Map Sym Container) mkSym :: (Monad m) => String -> m Sym mkSym (':':n@(':':_)) = mkSym n mkSym (s:name) = do sig <- mkSigil s return $ MkSym { symSigil = sig , symTwigil = TwigilNone -- XXX Stub , symPackage = [] -- XXX Stub , symName = MkName name } mkSym [] = fail "Empty symbol" mkSigil :: (Monad m) => Char -> m Sigil mkSigil '$' = return SigilScalar mkSigil '@' = return SigilArray mkSigil '%' = return SigilHash mkSigil '&' = return SigilCode mkSigil ':' = return SigilPackage mkSigil s = fail $ "Unknown sigil: " ++ [s] unSigil :: Sigil -> Char unSigil SigilScalar = '$' unSigil SigilArray = '@' unSigil SigilHash = '%' unSigil SigilCode = '&' unSigil SigilPackage= ':' -- $?CALLER::CALLER::SUB data Sym = MkSym { symSigil :: Sigil -- $ , symTwigil :: Twigil -- ? , symPackage :: [Name] -- [CALLER, CALLER] , symName :: Name -- SUB } deriving (Eq, Ord, Show, Typeable) data Sigil = SigilScalar -- $ | SigilArray -- @ | SigilHash -- % | SigilCode -- & | SigilPackage -- :: deriving (Eq, Ord, Show, Enum, Typeable) {-| A twigil (secondary sigil) represents a particular special type of variable. Examples of each include: * Lexically-scoped magical: @$?CLASS@ * Globally-available: @%*ENV@ * File-scoped magical: @%=POD@ * Implicit parameter in bare-block: @{ $^a + $^b }@ * Public member: @has $.skin@ * Private member: @has $:guts@ -} data Twigil = TwigilNone -- ^ No twigil (most variables) | TwigilCompiled -- ^ @?@ | TwigilGlobal -- ^ @*@ | TwigilFile -- ^ @=@ | TwigilImplicit -- ^ @^@ | TwigilPublic -- ^ @.@ | TwigilPrivate -- ^ @:@ deriving (Eq, Ord, Show, Enum, Typeable)