Changeset 12924
- Timestamp:
- 09/01/06 15:11:03 (2 years ago)
- Location:
- src/Pugs
- Files:
-
- 11 modified
-
AST.hs (modified) (1 diff)
-
AST/Internals.hs (modified) (4 diffs)
-
AST/Internals/Instances.hs (modified) (2 diffs)
-
CodeGen/PIR.hs (modified) (1 diff)
-
Eval.hs (modified) (1 diff)
-
Monads.hs (modified) (1 diff)
-
Parser.hs (modified) (4 diffs)
-
Parser/Operator.hs (modified) (2 diffs)
-
Parser/Util.hs (modified) (3 diffs)
-
Val.hs (modified) (1 diff)
-
Val/Code.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r12721 r12924 39 39 import Pugs.AST.SIO 40 40 import Pugs.AST.Pad 41 import Pugs.Val (val, PureStr, PureInt, PureNum, Capt(..), ValCapt, Feed(..), ValFeed, emptyFeed )41 import Pugs.Val (val, PureStr, PureInt, PureNum, Capt(..), ValCapt, Feed(..), ValFeed, emptyFeed, Sig(..), SigParam(..), ParamAccess(..), ParamDefault(..)) 42 42 43 43 {-| -
src/Pugs/AST/Internals.hs
r12800 r12924 778 778 779 779 These represent declared parameters; don't confuse them with actual parameter 780 values .781 -} 782 data Param = Mk Param780 values, which are henceforth termed "arguments". 781 -} 782 data Param = MkOldParam -- "Old" because Pugs.Val.Code defined a new one 783 783 { isInvocant :: !Bool -- ^ Is it in invocant slot? 784 784 , isOptional :: !Bool -- ^ Is it optional? … … 797 797 type Params = [Param] 798 798 799 paramToValParam :: Param -> Val. Param799 paramToValParam :: Param -> Val.SigParam 800 800 paramToValParam param = ret 801 801 where … … 809 809 , Val.p_slots = Map.empty 810 810 , Val.p_hasAccess = case param of 811 Mk Param { isLValue = True, isWritable = False } -> Val.AccessRO812 Mk Param { isLValue = True, isWritable = True } -> Val.AccessRW813 Mk Param { isLValue = False } -> Val.AccessCopy811 MkOldParam { isLValue = True, isWritable = False } -> Val.AccessRO 812 MkOldParam { isLValue = True, isWritable = True } -> Val.AccessRW 813 MkOldParam { isLValue = False } -> Val.AccessCopy 814 814 , Val.p_isRef = Val.p_hasAccess ret == Val.AccessRW 815 815 , Val.p_isLazy = isLazy param … … 1087 1087 -> Exp -- ^ Expression for the param's default value 1088 1088 -> Param 1089 buildParam typ sigil name e = Mk Param1089 buildParam typ sigil name e = MkOldParam 1090 1090 { isInvocant = False 1091 1091 , isOptional = '?' `elem` sigil -
src/Pugs/AST/Internals/Instances.hs
r12524 r12924 400 400 instance YAML Param where 401 401 fromYAML MkNode{n_tag=Just t, n_elem=e} | 't':'a':'g':':':'h':'s':':':tag <- unpackBuf t = case tag of 402 "Mk Param" -> do402 "MkOldParam" -> do 403 403 let liftM9 f m1 m2 m3 m4 m5 m6 m7 m8 m9 = do 404 404 {x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; x7 <- m7; x8 <- m8; x9 <- m9; return (f x1 x2 x3 x4 x5 x6 x7 x8 x9)} 405 405 let ESeq [aa, ab, ac, ad, ae, af, ag, ah, ai] = e 406 liftM9 MkParam (fromYAML aa) (fromYAML ab) (fromYAML ac) (fromYAML ad) (fromYAML ae) (fromYAML af) (fromYAML ag) (fromYAML ah) (fromYAML ai) 407 _ -> fail $ "unhandled tag: " ++ show t ++ ", expecting " ++ show ["MkParam"] ++ " in node " ++ show e 408 fromYAML _ = fail "no tag found" 409 asYAML (MkParam aa ab ac ad ae af ag ah ai) = asYAMLseq "MkParam" 406 liftM9 MkOldParam (fromYAML aa) (fromYAML ab) (fromYAML ac) (fromYAML ad) (fromYAML ae) (fromYAML af) (fromYAML ag) (fromYAML ah) (fromYAML ai) 407 _ -> fail $ "unhandled tag: " ++ show t ++ ", expecting " ++ show ["MkOldParam"] ++ " in node " ++ show e 408 fromYAML _ = fail "no tag found" 409 asYAML (MkOldParam aa ab ac ad ae af ag ah ai) = 410 asYAMLseq "MkOldParam" 410 411 [asYAML aa, asYAML ab, asYAML ac, asYAML ad, asYAML ae, asYAML af, 411 412 asYAML ag, asYAML ah, asYAML ai] 412 413 413 414 instance Perl5 Param where 414 showPerl5 (Mk Param aa ab ac ad ae af ag ah ai) =415 showP5HashObj "Mk Param"415 showPerl5 (MkOldParam aa ab ac ad ae af ag ah ai) = 416 showP5HashObj "MkOldParam" 416 417 [("isInvocant", showPerl5 aa) , ("isOptional", showPerl5 ab) , 417 418 ("isNamed", showPerl5 ac) , ("isLValue", showPerl5 ad) , … … 421 422 422 423 instance JSON Param where 423 showJSON (Mk Param aa ab ac ad ae af ag ah ai) =424 showJSHashObj "Mk Param"424 showJSON (MkOldParam aa ab ac ad ae af ag ah ai) = 425 showJSHashObj "MkOldParam" 425 426 [("isInvocant", showJSON aa), ("isOptional", showJSON ab), 426 427 ("isNamed", showJSON ac), ("isLValue", showJSON ad), -
src/Pugs/CodeGen/PIR.hs
r12324 r12924 15 15 module Pugs.CodeGen.PIR (genPIR, genPIR_YAML) where 16 16 import Pugs.Internals 17 import Pugs.AST 17 import Pugs.AST hiding (Sig) 18 18 import Pugs.Types 19 19 import Pugs.PIL1 -
src/Pugs/Eval.hs
r12852 r12924 1148 1148 return (syms', ApplyArg var val coll:restArgs) 1149 1149 expToVal :: Param -> Exp -> Eval (Val, Bool) 1150 expToVal Mk Param{ isLazy = thunk, isLValue = lv, paramContext = cxt, paramName = var, isWritable = rw } exp = do1150 expToVal MkOldParam{ isLazy = thunk, isLValue = lv, paramContext = cxt, paramName = var, isWritable = rw } exp = do 1151 1151 env <- ask -- freeze environment at this point for thunks 1152 1152 let eval = local (const env{ envLValue = lv }) $ do -
src/Pugs/Monads.hs
r12905 r12924 295 295 makeParams :: Env -> [Param] 296 296 makeParams MkEnv{ envContext = cxt, envLValue = lv } 297 = [ Mk Param297 = [ MkOldParam 298 298 { isInvocant = False 299 299 , isOptional = False -
src/Pugs/Parser.hs
r12852 r12924 29 29 import Pugs.Internals 30 30 import Pugs.AST 31 import qualified Pugs.Exp as Exp 31 32 import Pugs.Types 32 33 import Pugs.Version (versnum) … … 42 43 import Pugs.Parser.Util 43 44 import qualified Data.Map as Map 45 import qualified Data.Set as Set 44 46 45 47 -- Lexical units -------------------------------------------------- … … 1291 1293 term <- choice 1292 1294 [ ruleDereference 1295 , ruleSignatureVal -- must come before ruleTypeVar 1293 1296 , ruleVarDecl 1294 1297 , ruleVar … … 1312 1315 fs <- many s_postTerm 1313 1316 return $! combine (reverse fs) term 1317 1318 ruleSignatureVal :: RuleParser Exp 1319 ruleSignatureVal = do 1320 between (symbol ":(") (symbol ")") ruleSignature 1321 1322 data Paramdec = MkParamdec 1323 { p_param :: SigParam 1324 , p_isNamed :: Bool 1325 , p_isRequired :: Bool 1326 } 1327 deriving (Show) 1328 1329 ruleSignature :: RuleParser Exp 1330 ruleSignature = rule "Signature" $ do 1331 inv <- option Nothing $ try $ fmap (Just . p_param) $ followedBy ruleParam (symbol ":") 1332 params <- ruleParam `sepEndBy` (symbol ",") 1333 reqPosC <- validateRequired True params 1334 let reqNms = Set.fromAscList $ sort $ map (p_label . p_param) $ filter p_isRequired params 1335 posLs = map p_param $ filter (not . p_isNamed) params 1336 nmSt = Map.fromList $ map (\p -> (p_label $ p_param p, p_param p)) $ filter p_isNamed params 1337 slpScLs = [] 1338 slpArrLs = Nothing 1339 slpHsh = Nothing 1340 slpCd = Nothing 1341 slpCapt = Nothing 1342 return $ Val $ VV $ val $ case inv of 1343 Nothing -> SigSubSingle reqPosC reqNms posLs nmSt slpScLs slpArrLs slpHsh slpCd slpCapt 1344 Just i -> SigMethSingle i reqPosC reqNms posLs nmSt slpScLs slpArrLs slpHsh slpCd slpCapt 1345 where 1346 validateRequired _ [] = return 0 1347 validateRequired False (x:_) 1348 | isReqPos x = fail $ "Required parameter cannot come after optional ones: " ++ show x 1349 validateRequired _ (x:xs) = do 1350 next <- validateRequired (isReqPos x) xs 1351 return $ (fromEnum $ isReqPos x) + next 1352 isReqPos x = p_isRequired x && (not $ p_isNamed x) 1353 1354 {- 1355 { s_requiredPositionalCount :: Int 1356 , s_requiredNames :: Set ID 1357 , s_positionalList :: [Param] 1358 , s_namedSet :: Map.Map ID Param 1359 , s_slurpyScalarList :: [Param] 1360 , s_slurpyArray :: Maybe Param 1361 , s_slurpyHash :: Maybe Param 1362 , s_slurpyCode :: Maybe Param 1363 , s_slurpyCapture :: Maybe Param 1364 1365 data Param = MkParam 1366 { p_variable :: ID -- ^ E.g. $m above 1367 , p_types :: [Types.Type] -- ^ Static pieces of inferencer-food 1368 -- E.g. Elk above 1369 , p_constraints :: [Code] -- ^ Dynamic pieces of runtime-mood 1370 -- E.g. where {...} above 1371 , p_unpacking :: Maybe PureSig -- ^ E.g. BinTree $t (Left $l, Right $r) 1372 , p_default :: ParamDefault -- ^ E.g. $answer? = 42 1373 , p_label :: ID -- ^ The external name for the param ('m' above) 1374 , p_slots :: Table -- ^ Any additional attrib not 1375 -- explicitly mentioned below 1376 , p_hasAccess :: ParamAccess -- ^ is ro, is rw, is copy 1377 , p_isRef :: Bool -- ^ must be true if hasAccess = AccessRW 1378 , p_isLazy :: Bool 1379 } 1380 -} 1381 1382 -- we start with basic param parsing only - this'll grow. 1383 ruleParam :: RuleParser Paramdec 1384 ruleParam = rule "paramater" $ do 1385 name@(s:lab) <- regularVarName 1386 def <- option Nothing $ do 1387 symbol "?" 1388 fmap Just $ option DNil $ do 1389 symbol "=" 1390 fmap (DExp . Exp.EE . Exp.MkExpEmeritus) parseTerm 1391 access <- option AccessRO $ try $ do -- XXX: expand this to do arbitrary traits, in any order 1392 traits <- ruleTrait ["is"] 1393 case traits of 1394 ("is", "ro") -> return AccessRO 1395 ("is", "rw") -> return AccessRW 1396 ("is", "copy") -> return AccessCopy 1397 _ -> fail $ "unhandled trait: " ++ show traits 1398 let p = MkParam (cast name) [] [] Nothing (maybe DNil id def) (cast lab) Map.empty access False False 1399 return $ MkParamdec{ p_param = p, p_isRequired = isNothing def, p_isNamed = False } 1400 1401 1314 1402 1315 1403 ruleTypeVar :: RuleParser Exp -
src/Pugs/Parser/Operator.hs
r12794 r12924 275 275 matchUnary :: CurrentFunction -> Bool 276 276 matchUnary MkCurrentFunction 277 { f_assoc = ANil, f_params = [Mk Param277 { f_assoc = ANil, f_params = [MkOldParam 278 278 { paramContext = CxtItem{}, isNamed = False }] } = True 279 279 matchUnary _ = False … … 288 288 { f_params = (_:_:_) } = True 289 289 matchSlurpy MkCurrentFunction 290 { f_params = [Mk Param290 { f_params = [MkOldParam 291 291 { paramContext = CxtSlurpy{}, paramName = MkVar{ v_sigil = sig } }] } 292 292 = sig == SArray || sig == SArrayMulti -
src/Pugs/Parser/Util.hs
r12777 r12924 115 115 116 116 nameToParam :: Var -> Param 117 nameToParam name = Mk Param117 nameToParam name = MkOldParam 118 118 { isInvocant = False 119 119 , isOptional = False … … 151 151 -- | A Param representing the default (unnamed) invocant of a method on the given type. 152 152 selfParam :: Type -> Param 153 selfParam typ = Mk Param153 selfParam typ = MkOldParam 154 154 { isInvocant = True 155 155 , isOptional = False … … 223 223 isBreakingSpace _ = False 224 224 225 tryFollowedBy :: RuleParser a -> RuleParser b -> RuleParser a226 tryFollowedBy rule after = try $do225 followedBy, tryFollowedBy :: RuleParser a -> RuleParser b -> RuleParser a 226 followedBy rule after = do 227 227 rv <- rule 228 228 after 229 229 return rv 230 230 231 tryFollowedBy = (try .) . followedBy -
src/Pugs/Val.hs
r12733 r12924 18 18 19 19 -- From Code 20 Sig(..), Param(..), ParamAccess(..), ParamDefault(..),20 Sig(..), SigParam(..), ParamAccess(..), ParamDefault(..), 21 21 Capt(..), Feed(..), emptyFeed, Code(..), 22 22 ValCapt, ValFeed, -
src/Pugs/Val/Code.hs
r12721 r12924 97 97 values. 98 98 -} 99 data Param = MkParam99 data SigParam = MkParam 100 100 { p_variable :: ID -- ^ E.g. $m above 101 101 , p_types :: [Types.Type] -- ^ Static pieces of inferencer-food … … 113 113 } 114 114 deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos, Perl6Class, MooseClass!-} 115 116 type Param = SigParam -- to get around name clashes in Pugs.AST :( 115 117 116 118 newtype CodeBody = MkCodeBody [Stmt]
