Changeset 12317
- Timestamp:
- 08/16/06 19:28:24 (2 years ago)
- Location:
- src
- Files:
-
- 40 modified
-
Pugs.hs (modified) (2 diffs)
-
Pugs/AST.hs (modified) (11 diffs)
-
Pugs/AST/Eval.hs (modified) (2 diffs)
-
Pugs/AST/Internals.hs (modified) (28 diffs)
-
Pugs/AST/Internals.hs-boot (modified) (1 diff)
-
Pugs/AST/Internals/Instances.hs (modified) (3 diffs)
-
Pugs/AST/SIO.hs (modified) (3 diffs)
-
Pugs/AST/Utils.hs (modified) (2 diffs)
-
Pugs/Bind.hs (modified) (8 diffs)
-
Pugs/CodeGen/PIR.hs (modified) (9 diffs)
-
Pugs/Compile.hs (modified) (15 diffs)
-
Pugs/Compile/Haskell.hs (modified) (1 diff)
-
Pugs/Compile/PIL2.hs (modified) (16 diffs)
-
Pugs/Compile/Pugs.hs (modified) (1 diff)
-
Pugs/Embed/Perl5.hs (modified) (7 diffs)
-
Pugs/Eval.hs (modified) (32 diffs)
-
Pugs/Eval/Var.hs (modified) (18 diffs)
-
Pugs/External.hs (modified) (1 diff)
-
Pugs/Internals.hs (modified) (5 diffs)
-
Pugs/Junc.hs (modified) (2 diffs)
-
Pugs/Lexer.hs (modified) (5 diffs)
-
Pugs/Monads.hs (modified) (11 diffs)
-
Pugs/Parser.hs (modified) (44 diffs)
-
Pugs/Parser/Export.hs (modified) (1 diff)
-
Pugs/Parser/Literal.hs (modified) (3 diffs)
-
Pugs/Parser/Operator.hs (modified) (8 diffs)
-
Pugs/Parser/Program.hs (modified) (1 diff)
-
Pugs/Parser/Types.hs (modified) (5 diffs)
-
Pugs/Parser/Util.hs (modified) (7 diffs)
-
Pugs/Pretty.hs (modified) (3 diffs)
-
Pugs/Prim.hs (modified) (27 diffs)
-
Pugs/Prim/Code.hs (modified) (1 diff)
-
Pugs/Prim/Eval.hs (modified) (5 diffs)
-
Pugs/Prim/List.hs (modified) (2 diffs)
-
Pugs/Prim/Match.hs (modified) (7 diffs)
-
Pugs/Prim/Param.hs (modified) (2 diffs)
-
Pugs/Prim/Yaml.hs (modified) (1 diff)
-
Pugs/Run.hs (modified) (2 diffs)
-
Pugs/Types.hs (modified) (6 diffs)
-
Pugs/Val.hs-boot (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs.hs
r11933 r12317 303 303 return () 304 304 where 305 exp = App ( Var "&require") Nothing [Val $ VStr fn]305 exp = App (_Var "&require") Nothing [Val $ VStr fn] 306 306 307 307 doRunSingle :: TVar Env -> RunOptions -> String -> IO () … … 315 315 ref <- liftSTM $ do 316 316 pad <- readTVar (envGlobal env') 317 readTVar $ fromJust (findSym "$*_"pad)317 readTVar $ fromJust (findSym (cast "$*_") pad) 318 318 val <- runEvalIO env' $ readRef ref 319 319 liftSTM $ writeTVar menv env' -
src/Pugs/AST.hs
r12176 r12317 31 31 import Pugs.Types 32 32 import qualified Data.Map as Map 33 import Pugs.AST.Internals.Instances 33 import qualified Data.Set as Set 34 import Pugs.AST.Internals.Instances () 34 35 import Pugs.AST.Internals 35 36 import Pugs.AST.Prag … … 100 101 (Is this correct?) 101 102 -} 102 genMultiSym :: MonadSTM m => String-> VRef -> m PadMutator103 genMultiSym :: MonadSTM m => Var -> VRef -> m PadMutator 103 104 genMultiSym name ref = do 104 105 --trace ("installing multi: " ++ name) $ return () … … 114 115 (right?), shadowing any earlier or outer definition. 115 116 -} 116 genSym :: MonadSTM m => String-> VRef -> m PadMutator117 genSym nameref = do117 genSym :: MonadSTM m => Var -> VRef -> m PadMutator 118 genSym var ref = do 118 119 --trace ("installing: " ++ name) $ return () 119 120 tvar <- liftSTM $ newTVar ref 120 121 fresh <- liftSTM $ newTVar True 121 return $ \(MkPad map) -> MkPad $ Map.insert name(MkEntry (fresh, tvar)) map122 return $ \(MkPad map) -> MkPad $ Map.insert var (MkEntry (fresh, tvar)) map 122 123 123 124 {-| … … 131 132 Pad _ _ exp -> isScalarLValue exp 132 133 Sym _ _ exp -> isScalarLValue exp 133 Var ('$':_)-> True134 Var var | SScalar <- v_sigil var -> True 134 135 Syn "${}" _ -> True -- XXX - Change tp App("&prefix:<$>") later 135 136 Syn "$::()" _ -> True … … 141 142 where 142 143 isSIMPLE x = case unwrap x of 143 App (Var ('&':'p':'r':'e':'f':'i':'x':':':op)) Nothing [y] 144 -> op `elem` coercePrefixOps || (op `elem` simplePrefixOps && isSIMPLE y) 145 App (Var ('&':'p':'r':'e':'f':'i':'x':':':op)) (Just y) [] 146 -> op `elem` coercePrefixOps || (op `elem` simplePrefixOps && isSIMPLE y) 147 App (Var ('&':'p':'o':'s':'t':'f':'i':'x':':':op)) Nothing [y] 148 -> op `elem` simplePostfixOps && isSIMPLE y 149 App (Var ('&':'p':'o':'s':'t':'f':'i':'x':':':op)) (Just y) [] 150 -> op `elem` simplePostfixOps && isSIMPLE y 151 App (Var ('&':'i':'n':'f':'i':'x':':':op)) Nothing [y, z] 152 -> op `elem` simpleInfixOps && isSIMPLE y && isSIMPLE z 153 App (Var ('&':'i':'n':'f':'i':'x':':':op)) (Just y) [z] 154 -> op `elem` simpleInfixOps && isSIMPLE y && isSIMPLE z 144 App (Var var) Nothing [y] 145 | C_prefix <- v_categ var 146 -> var `Set.member` coercePrefixOps 147 || (var `Set.member` simplePrefixOps && isSIMPLE y) 148 | C_postfix <- v_categ var 149 -> var `Set.member` simplePostfixOps && isSIMPLE y 150 App (Var var) (Just y) [] 151 | C_prefix <- v_categ var 152 -> var `Set.member` coercePrefixOps 153 || (var `Set.member` simplePrefixOps && isSIMPLE y) 154 | C_postfix <- v_categ var 155 -> var `Set.member` simplePostfixOps && isSIMPLE y 156 App (Var var) Nothing [x, y] 157 | C_infix <- v_categ var 158 -> var `Set.member` simpleInfixOps && isSIMPLE x && isSIMPLE y 159 App (Var var) (Just x) [y] 160 | C_infix <- v_categ var 161 -> var `Set.member` simpleInfixOps && isSIMPLE x && isSIMPLE y 155 162 _ -> isScalarLValue x 156 coercePrefixOps = 157 [ "!","+","-","~","?","$" ] 158 simplePrefixOps = 159 [ "++","--" 160 , "$","&","+^","~^","?^","\\","^","=" 161 ] 162 simplePostfixOps = ["++", "--"] 163 simpleInfixOps = 164 [ "**" 165 , "**=" 166 , "*","/","%","x","+&","+<","+>","~&","~<","~>" 167 , "*=","/=","%=","x=","+&=","+<=","+>=","~&=","~<=","~>=" 168 , "+","-","~","+|","+^","~|","~^" 169 , "+=","-=","~=","+|=","+^=","~|=","~^=" 170 ] 163 164 opSet :: VarCateg -> [String] -> Set Var 165 opSet cat posts = Set.fromList $ map doMakeVar posts 166 where 167 doMakeVar name = MkVar 168 { v_sigil = SCode 169 , v_twigil = TNone 170 , v_package = emptyPkg 171 , v_categ = cat 172 , v_name = cast name 173 } 174 175 coercePrefixOps, simplePrefixOps, simplePostfixOps, simpleInfixOps :: Set Var 176 coercePrefixOps = opSet C_prefix [ "!","+","-","~","?","$" ] 177 simplePrefixOps = opSet C_prefix 178 [ "++","--" 179 , "$","&","+^","~^","?^","\\","^","=" 180 ] 181 simplePostfixOps = opSet C_postfix ["++", "--"] 182 simpleInfixOps = opSet C_infix 183 [ "**" 184 , "**=" 185 , "*","/","%","x","+&","+<","+>","~&","~<","~>" 186 , "*=","/=","%=","x=","+&=","+<=","+>=","~&=","~<=","~>=" 187 , "+","-","~","+|","+^","~|","~^" 188 , "+=","-=","~=","+|=","+^=","~|=","~^=" 189 ] 190 191 171 192 172 193 … … 181 202 Syn "namespace" [kind, pkg, y] 182 203 mergeStmts x@(Ann ann (Syn syn _)) y | (syn ==) `any` words "subst match //" = 183 mergeStmts (Ann ann (App ( Var "&infix:~~") Nothing [Var "$_", x])) y204 mergeStmts (Ann ann (App (_Var "&infix:~~") Nothing [_Var "$_", x])) y 184 205 mergeStmts x y@(Ann ann (Syn syn _)) | (syn ==) `any` words "subst match //" = 185 mergeStmts x (Ann ann (App ( Var "&infix:~~") Nothing [Var "$_", y]))206 mergeStmts x (Ann ann (App (_Var "&infix:~~") Nothing [_Var "$_", y])) 186 207 mergeStmts (Ann ann (Syn "sub" [Val (VCode sub)])) y | subType sub == SubBlock = 187 208 -- bare Block in statement level; annul all its parameters and run it! … … 196 217 isEmptyParams :: [Param] -> Bool 197 218 isEmptyParams [] = True 198 isEmptyParams [x] | [_, '_'] <- paramName x = True 219 isEmptyParams [x] 220 | var <- paramName x 221 , _underscore == v_name var 222 , emptyPkg == v_package var 223 , TNone == v_twigil var 224 = True 199 225 isEmptyParams _ = False 226 227 _underscore :: ID 228 _underscore = cast "_" 200 229 201 230 newPackage :: String -> String -> [String] -> [String] -> Exp 202 231 newPackage cls name classes roles = Stmts metaObj (newType name) 203 232 where 204 metaObj = Sym SGlobal (':':'*':name) $! Syn ":="205 [ Var (':':'*':name)206 , App ( Var "&META::new")233 metaObj = _Sym SGlobal (':':'*':name) $! Syn ":=" 234 [ _Var (':':'*':name) 235 , App (_Var "&META::new") 207 236 (Just $ Val (VType $ mkType cls)) 208 237 [ Syn "named" … … 222 251 223 252 newType :: String -> Exp 224 newType name = Sym SGlobal ('&':'&':'*':name) $! Syn ":="225 [ Var ('&':'*':name)253 newType name = _Sym SGlobal ('&':'&':'*':name) $! Syn ":=" 254 [ _Var ('&':'*':name) 226 255 , typeMacro name (Val . VType . mkType $ name) 227 256 ] 228 257 229 258 newMetaType :: String -> Exp 230 newMetaType name = Sym SGlobal ('&':'&':'*':name) $! Syn ":="231 [ Var ('&':'*':name)232 , typeMacro name ( Var (':':'*':name))259 newMetaType name = _Sym SGlobal ('&':'&':'*':name) $! Syn ":=" 260 [ _Var ('&':'*':name) 261 , typeMacro name (_Var (':':'*':name)) 233 262 ] 234 263 … … 236 265 typeMacro name exp = Syn "sub" . (:[]) . Val . VCode $ MkCode 237 266 { isMulti = True 238 , subName = name267 , subName = cast ('&':name) 239 268 , subEnv = Nothing 240 269 , subType = SubMacro … … 259 288 fmap (MkPad . Map.fromAscList . catMaybes) . mapM checkPrim $ Map.toAscList pad 260 289 261 checkPrim :: (String, PadEntry) -> Eval (Maybe (String, PadEntry)) 262 checkPrim ((':':'*':_), _) = return Nothing 263 checkPrim e@((_, MkEntry (_, tv))) = do 264 rv <- isPrim tv 265 return $ if rv then Nothing else Just e 266 checkPrim (key, MkEntryMulti xs) = do 267 xs' <- filterM (fmap not . isPrim . snd) xs 268 return $ if null xs' then Nothing else Just (key, MkEntryMulti xs') 290 checkPrim :: (Var, PadEntry) -> Eval (Maybe (Var, PadEntry)) 291 checkPrim e@(var, entry) 292 | SType <- v_sigil var, isGlobalVar var = return Nothing 293 | MkEntry (_, tv) <- entry = do 294 rv <- isPrim tv 295 return $ if rv then Nothing else Just e 296 | otherwise = do 297 let MkEntryMulti xs = entry 298 xs' <- filterM (fmap not . isPrim . snd) xs 299 return $ if null xs' then Nothing else Just (var, MkEntryMulti xs') 269 300 270 301 isPrim :: TVar VRef -> Eval Bool … … 282 313 filterUserDefinedPad (MkPad pad) = MkPad $ Map.filterWithKey doFilter pad 283 314 where 284 doFilter key _ = not (key `elem` reserved) 285 reserved = words $ 286 "@*ARGS @*INC %*INC $*PUGS_HAS_HSPLUGINS $*EXECUTABLE_NAME " ++ 287 "$*PROGRAM_NAME $*PID $*UID $*EUID $*GID $*EGID @*CHECK @*INIT $*IN " ++ 288 "$*OUT $*ERR $*ARGS $/ %*ENV $*CWD @=POD $=POD $?PUGS_VERSION " ++ 289 "$*OS &?BLOCK_EXIT %?CONFIG $*_ $*AUTOLOAD" 290 315 doFilter key _ = key `Set.notMember` _reserved 316 317 _reserved :: Set Var 318 _reserved = Set.fromList . cast . words $ 319 "@*ARGS @*INC %*INC $*PUGS_HAS_HSPLUGINS $*EXECUTABLE_NAME " ++ 320 "$*PROGRAM_NAME $*PID $*UID $*EUID $*GID $*EGID @*CHECK @*INIT $*IN " ++ 321 "$*OUT $*ERR $*ARGS $/ %*ENV $*CWD @=POD $=POD $?PUGS_VERSION " ++ 322 "$*OS &?BLOCK_EXIT %?CONFIG $*_ $*AUTOLOAD" -
src/Pugs/AST/Eval.hs
r12173 r12317 108 108 fail str = do 109 109 pos <- asks envPos' 110 shiftT . const . return $ errStrPos strpos110 shiftT . const . return $ errStrPos (cast str) pos 111 111 112 112 instance MonadTrans EvalT where … … 183 183 -} 184 184 185 retError :: (Show a) => VStr-> a -> Eval b185 retError :: (Show a) => String -> a -> Eval b 186 186 retError str a = fail $ str ++ ": " ++ show a 187 187 -
src/Pugs/AST/Internals.hs
r12230 r12317 65 65 refreshPad, lookupPad, padToList, listToPad, 66 66 mkPrim, mkSub, showRat, showTrueRat, 67 cxtOfSigil, typeOfSigil,67 cxtOfSigil, cxtOfSigilVar, typeOfSigil, typeOfSigilVar, 68 68 buildParam, defaultArrayParam, defaultHashParam, defaultScalarParam, 69 69 emptyExp, … … 76 76 errStrPos, errValPos, enterAtomicEnv, valToBool, envPos', -- for circularity 77 77 expToEvalVal, -- Hack, should be removed once it's figured out how 78 79 _Sym, _Var, -- String -> ByteString constructors 78 80 ) where 79 81 import Pugs.Internals 80 82 import Pugs.Types 81 83 import Pugs.Cont hiding (shiftT, resetT) 82 import System.IO.Error (try)83 84 import qualified Data.Set as Set 84 85 import qualified Data.Map as Map … … 98 99 import Pugs.Embed.Perl5 99 100 import qualified Pugs.Val as Val 101 import qualified Data.ByteString.Char8 as Str 100 102 import Pugs.Val hiding (Val, IValue, VUndef) 101 103 … … 377 379 castV = VCode 378 380 fromSV sv = return $ mkPrim 379 { subName = "<anon>"381 { subName = cast "<anon>" 380 382 , subParams = [defaultArrayParam] 381 383 , subReturns = mkType "Scalar::Perl5" … … 521 523 doCast (VNum n) = return $ showNum n 522 524 doCast (VList l) = fmap unwords (mapM fromVal l) 523 doCast (VCode s) = return $ "<" ++ show (subType s) ++ "(" ++ subName s++ ")>"525 doCast (VCode s) = return $ "<" ++ show (subType s) ++ "(" ++ cast (subName s) ++ ")>" 524 526 doCast (VJunc j) = return $ show j 525 527 doCast (VThread t) = return $ takeWhile isDigit $ dropWhile (not . isDigit) $ show t … … 647 649 , rxGlobal :: !Bool -- ^ Flag indicating \'global\' (match-all) 648 650 , rxNumSubs :: !Int -- ^ The number of subpatterns present. 649 , rxStringify :: !Bool651 , rxStringify :: !Bool 650 652 , rxRuleStr :: !String -- ^ The rule string, for user reference. 651 653 , rxAdverbs :: !Val … … 784 786 , isWritable :: !Bool -- ^ Is it writable (i.e. `is rw`)? 785 787 , isLazy :: !Bool -- ^ Is it call-by-name (short-circuit)? 786 , paramName :: ! String-- ^ Parameter name788 , paramName :: !Var -- ^ Parameter name 787 789 , paramContext :: !Cxt -- ^ Parameter context: slurpiness and type 788 790 , paramDefault :: !Exp -- ^ Default expression (to evaluate to) … … 826 828 data VCode = MkCode 827 829 { isMulti :: !Bool -- ^ Is this a multi sub\/method? 828 , subName :: ! String-- ^ Name of the closure830 , subName :: !ByteString -- ^ Name of the closure 829 831 , subType :: !SubType -- ^ Type of the closure 830 832 , subEnv :: !(Maybe Env) -- ^ Lexical pad for sub\/method … … 848 850 mkPrim = MkCode 849 851 { isMulti = True 850 , subName = ""852 , subName = cast "&" 851 853 , subType = SubPrim 852 854 , subEnv = Nothing … … 864 866 mkSub = MkCode 865 867 { isMulti = False 866 , subName = ""868 , subName = cast "&" 867 869 , subType = SubBlock 868 870 , subEnv = Nothing … … 922 924 | NonTerm !Pos -- ^ Parse error 923 925 deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos!-} 926 927 _Sym :: Scope -> String -> Exp -> Exp 928 _Sym scope str exp = Sym scope (cast str) exp 929 930 _Var :: String -> Exp 931 _Var str = Var (cast str) 924 932 925 933 instance Value Exp where … … 988 996 compare _ _ = EQ 989 997 990 extractPlaceholderVarsExp :: Exp -> ([Exp], [ String]) -> ([Exp], [String])998 extractPlaceholderVarsExp :: Exp -> ([Exp], [Var]) -> ([Exp], [Var]) 991 999 extractPlaceholderVarsExp ex (exps, vs) = (ex':exps, vs') 992 1000 where … … 994 1002 995 1003 {-| Deduce the placeholder vars ($^a, $^x etc.) used by a block). -} 996 extractPlaceholderVars :: Exp -> [ String] -> (Exp, [String])1004 extractPlaceholderVars :: Exp -> [Var] -> (Exp, [Var]) 997 1005 extractPlaceholderVars (App n invs args) vs = (App n' invs' args', vs''') 998 1006 where … … 1008 1016 (exps', vs') = foldr extractPlaceholderVarsExp ([], vs) exps 1009 1017 vs'' = case n of 1010 "when" -> nub $ vs' ++ ["$_"]1011 "given" -> delete "$_"vs'1018 "when" -> nub (cast "$_" : vs') 1019 "given" -> delete (cast "$_") vs' 1012 1020 _ -> vs' 1013 extractPlaceholderVars (Var name) vs1014 | (sigil:'^':identifer) <- name1015 , name' <- (sigil : identifer)1016 = (Var name', nub (name':vs))1017 | name =="$_"1018 = (Var name, nub (name:vs))1021 extractPlaceholderVars (Var var) vs 1022 | TImplicit <- v_twigil var 1023 , var' <- var{ v_twigil = TNone } 1024 = (Var var', nub (var':vs)) 1025 | var == cast "$_" 1026 = (Var var, nub (var:vs)) 1019 1027 | otherwise 1020 = (Var name, vs)1028 = (Var var, vs) 1021 1029 extractPlaceholderVars (Ann ann ex) vs = ((Ann ann ex'), vs') 1022 1030 where … … 1042 1050 , isWritable = (name == "$_") 1043 1051 , isLazy = False 1044 , paramName = name1052 , paramName = cast name 1045 1053 , paramContext = if '*' `elem` sigil 1046 1054 then CxtSlurpy typ' … … 1057 1065 defaultArrayParam = buildParam "" "*" "@_" (Val VUndef) 1058 1066 defaultHashParam = buildParam "" "*" "%_" (Val VUndef) 1059 defaultScalarParam = buildParam "" "?" "$_" (Var "$_")1060 1061 type DebugInfo = Maybe (TVar (Map StringString))1067 defaultScalarParam = buildParam "" "?" "$_" (Var $ cast "$_") 1068 1069 type DebugInfo = Maybe (TVar (Map ID String)) 1062 1070 1063 1071 {-| … … 1075 1083 , envImplicit:: !(Map Var ()) -- ^ Set of implicit variables 1076 1084 , envGlobal :: !(TVar Pad) -- ^ Global pad for variable lookup 1077 , envPackage :: ! String-- ^ Current package1085 , envPackage :: !Pkg -- ^ Current package 1078 1086 , envClasses :: !ClassTree -- ^ Current class tree 1079 1087 , envEval :: !(Exp -> Eval Val) -- ^ Active evaluator … … 1155 1163 if isFresh then do { writeTVar fresh False; return orig } else do 1156 1164 -- regen TVar -- this is not the first time entering this scope 1157 ref <- newObject (typeOfSigil $ headname)1165 ref <- newObject (typeOfSigilVar name) 1158 1166 tvar' <- newTVar ref 1159 1167 return (fresh, tvar') … … 1186 1194 show pad = "MkPad (padToList " ++ show (padToList pad) ++ ")" 1187 1195 1188 findSymRef :: String-> Pad -> Eval VRef1196 findSymRef :: Var -> Pad -> Eval VRef 1189 1197 findSymRef name pad = do 1190 1198 case findSym name pad of … … 1192 1200 Nothing -> fail $ "Cannot find variable: " ++ show name 1193 1201 1194 findSym :: String-> Pad -> Maybe (TVar VRef)1202 findSym :: Var -> Pad -> Maybe (TVar VRef) 1195 1203 findSym name pad = case lookupPad name pad of 1196 1204 Just (x:_) -> Just x … … 1210 1218 1211 1219 lookupPad key (MkPad map) = case Map.lookup (possiblyFixOperatorName key) map of 1212 Just (MkEntryMulti xs) -> Just [tvar | (_, tvar) <- xs]1213 Just (MkEntry (_, tvar)) -> Just [tvar]1214 Nothing -> Nothing1220 Just (MkEntryMulti xs) -> Just [tvar | (_, tvar) <- xs] 1221 Just (MkEntry (_, tvar)) -> Just [tvar] 1222 Nothing -> Nothing 1215 1223 1216 1224 {-| … … 1220 1228 -} 1221 1229 padToList :: Pad -> [(Var, [(TVar Bool, TVar VRef)])] 1222 padToList (MkPad map) = (Map.assocs . Map.map entryToList) map1230 padToList (MkPad map) = [ (cast k, entryToList v) | (k, v) <- Map.assocs map ] 1223 1231 where 1224 1232 entryToList (MkEntry x) = [x] … … 1226 1234 1227 1235 listToPad :: [(Var, [(TVar Bool, TVar VRef)])] -> Pad 1228 listToPad = MkPad . Map.map listToEntry . Map.fromList1236 listToPad entries = MkPad (Map.fromList [ (cast k, listToEntry v) | (k, v) <- entries ]) 1229 1237 where 1230 1238 listToEntry [x] = MkEntry x … … 1274 1282 1275 1283 readVar :: Var -> Eval Val 1276 readVar name@(_:'*':_) = do 1277 glob <- askGlobal 1278 case findSym name glob of 1279 Just tvar -> do 1280 ref <- liftSTM $ readTVar tvar 1281 readRef ref 1282 _ -> return undef 1283 readVar name@(sigil:rest) = do 1284 lex <- asks envLexical 1285 case findSym name lex of 1286 Just tvar -> do 1287 ref <- liftSTM $ readTVar tvar 1288 readRef ref 1289 _ -> readVar (sigil:'*':rest) 1290 readVar _ = return undef 1284 readVar var 1285 | isGlobalVar var = do 1286 glob <- askGlobal 1287 case findSym var glob of 1288 Just tvar -> do 1289 ref <- liftSTM $ readTVar tvar 1290 readRef ref 1291 _ -> return undef 1292 | otherwise = do 1293 lex <- asks envLexical 1294 case findSym var lex of 1295 Just tvar -> do 1296 ref <- liftSTM $ readTVar tvar 1297 readRef ref 1298 -- XXX - fallback to global should be eliminated here 1299 _ -> readVar (toGlobalVar var) 1291 1300 1292 1301 {-| … … 1673 1682 , envLValue = False 1674 1683 , envGlobal = glob 1675 , envPackage = "main"1684 , envPackage = cast "Main" 1676 1685 , envClasses = initTree 1677 1686 , envEval = const (return VUndef) … … 1704 1713 asYAML x = asYAMLmap "Map" $ Map.toAscList (Map.map asYAML x) 1705 1714 fromYAML node = fmap Map.fromList (fromYAMLmap node) 1715 instance YAML a => YAML (Map Var a) where 1716 asYAML x = asYAMLmap "Map" . sortBy (\x y -> fst x `compare` fst y) $ 1717 [ (cast k, asYAML v) | (k, v) <- Map.toList x ] 1718 fromYAML node = do 1719 list <- fromYAMLmap node 1720 fmap Map.fromList . forM list $ \(k, v) -> do 1721 return (cast k, v) 1706 1722 instance Typeable a => YAML (IVar a) where 1707 1723 asYAML x = asYAML (MkRef x) … … 1767 1783 showJSON x = showJSON (cast x :: ByteString) 1768 1784 1785 instance YAML Var where 1786 asYAML x = asYAML (cast x :: String) 1787 fromYAML = fmap (cast :: String -> Var) . fromYAML 1788 1789 instance Perl5 Var where 1790 showPerl5 x = showPerl5 (cast x :: String) 1791 instance JSON Var where 1792 showJSON x = showJSON (cast x :: String) 1793 1769 1794 instance YAML VControl 1770 1795 instance YAML (Set Val) … … 1836 1861 {-!derive: YAML_Pos, JSON, Perl5!-} 1837 1862 1838 data Pad = MkPad { padEntries :: Map VarPadEntry }1863 data Pad = MkPad { padEntries :: IntMap PadEntry } 1839 1864 {-!derive: YAML_Pos!-} 1840 1865 -
src/Pugs/AST/Internals.hs-boot
r12173 r12317 6 6 import Pugs.AST.Pos 7 7 import Pugs.AST.SIO 8 import Pugs.Cont hiding (shiftT, resetT)9 8 import Control.Concurrent.STM 10 9 import Data.Dynamic -
src/Pugs/AST/Internals/Instances.hs
