Changeset 3053
- Timestamp:
- 05/12/05 11:58:41 (4 years ago)
- svk:copy_cache_prev:
- 4536
- Files:
-
- 7 modified
-
ext/Set/lib/Set.pm (modified) (3 diffs)
-
ext/Set/t/basic.t (modified) (3 diffs)
-
src/Pugs/AST/Internals.hs (modified) (2 diffs)
-
src/Pugs/Eval.hs (modified) (3 diffs)
-
src/Pugs/Parser.hs (modified) (6 diffs)
-
src/Pugs/Prim.hs (modified) (3 diffs)
-
src/Pugs/Prim/Keyed.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ext/Set/lib/Set.pm
r3048 r3053 4 4 class Set; 5 5 6 sub set(*@contents) is export returns Set { 7 return Set.new(*@contents); 8 }; 6 sub set (*@contents) returns Set is export { 7 my $set = Set.new; 8 $set.insert(@contents); 9 return $set; 10 } 9 11 10 12 # the Set is represented as a hash of (v => v) 11 13 has Hash %:members; 12 14 13 sub new($self: *@items){14 $self.insert(@items);15 } ;15 method members() returns List { 16 %:members.values; 17 } 16 18 17 sub members($self:) returns List { 18 %:members.values; 19 }; 20 21 sub insert($self: *@items) returns int { 22 my int $inserted = 0; 19 method insert(*@items) returns Int { 20 my Int $inserted = 0; 23 21 for @items -> $item { 24 if ( !%:members.exists($item) ) {22 unless ( %:members.exists($item) ) { 25 23 $inserted++; 26 %:members <$item>= $item;24 %:members{$item} = $item; 27 25 } 28 26 } 29 27 return $inserted; 30 } ;28 } 31 29 32 sub remove($self: *@items) returns int {33 my int $removed = 0;30 method remove(*@items) returns Int { 31 my Int $removed = 0; 34 32 for @items -> $item { 35 33 if ( %:members.delete($item) ) { … … 38 36 } 39 37 return $removed; 40 } ;38 } 41 39 42 sub includes($self:*@items) returns Bool {40 method includes(*@items) returns Bool { 43 41 return %:members.exists(all(@items)); 44 } ;42 } 45 43 46 sub member($self:$item) returns Object {47 return %:members <$item>;48 } ;44 method member($item) returns Object { 45 return %:members{$item} 46 } 49 47 50 sub size($self:) returns int {51 %:members.size;52 } ;48 method size() returns int { 49 +%:members.keys; 50 } 53 51 54 sub invert($self:*@items) returns int {52 method invert(*@items) returns int { 55 53 my int $rv; 56 54 for @items -> $item { … … 63 61 } 64 62 return $rv; 65 } ;63 } 66 64 67 sub clear($self:) {68 %:members=();69 } ;65 method clear() { 66 undef %:members; 67 } 70 68 71 &element ::= &member; 72 &has ::= &includes; 73 &contains ::= &includes; 74 &count ::= &size; 75 &delete ::= &remove; 76 77 69 our &Set::count ::= &Set::size; 70 our &Set::has ::= &Set::includes; -
ext/Set/t/basic.t
r3047 r3053 7 7 use Set; 8 8 9 my $bob = bless {}, "Bob"; 10 my $bert = bless {}, "Bert"; 9 class Bob {}; 10 class Bert {}; 11 12 my $bob = Bob.new; 13 my $bert = Bert.new; 11 14 12 15 my $set = set(0, 1, 2, 3, $bob); 13 is a_ok($set, "Set", "set()");16 is($set.ref, ::Set, "set()"); 14 17 15 18 ok($set.includes(0), ".includes(0)"); … … 31 34 is($set.size, 6, ".size"); 32 35 # remove also returns the number of elements removed 33 is($set.remove(4, 5), 1, ".remove");36 is($set.remove(4, 5), 2, ".remove"); 34 37 35 38 # members returns all the items. testing this with junctions is maybe 36 39 # not thorough enough... 37 ok(all($set.members) == one(0, 1, 2, 3, $bob), ".members()");40 is($set.members, [0, 1, 2, 3, $bob], ".members()"); 38 41 39 42 $set.clear(); … … 49 52 # sub-class test, too - to make sure the interface works if you only 50 53 # define the bare minimum number of methods in a Set sub-class 54 -
src/Pugs/AST/Internals.hs
r3034 r3053 75 75 -> (Eval a) -- ^ The @else@ case 76 76 -> Eval a 77 ifValTypeIsa v (':':typ) trueM falseM = ifValTypeIsa v typ trueM falseM 77 78 ifValTypeIsa v typ trueM falseM = do 78 79 env <- ask … … 339 340 vCast (VHandle h) = "<" ++ "VHandle (" ++ (show h) ++ ">" 340 341 vCast (VMatch m) = matchStr m 341 vCast (VType typ) = "::" ++ showType typ342 vCast (VType typ) = showType typ -- "::" ++ showType typ 342 343 vCast (VObject o) = "<obj:" ++ showType (objType o) ++ ">" 343 344 vCast x = castFail x -
src/Pugs/Eval.hs
r3033 r3053 823 823 chainFun :: Params -> Exp -> Params -> Exp -> [Val] -> Eval Val 824 824 chainFun p1 f1 p2 f2 (v1:v2:vs) = do 825 val <- applyExp (chainArgs p1 [v1, v2]) f1825 val <- applyExp SubPrim (chainArgs p1 [v1, v2]) f1 826 826 case val of 827 827 VBool False -> return val 828 _ -> applyExp (chainArgs p2 (v2:vs)) f2828 _ -> applyExp SubPrim (chainArgs p2 (v2:vs)) f2 829 829 where 830 830 chainArgs prms vals = map chainArg (prms `zip` vals) … … 832 832 chainFun _ _ _ _ _ = internalError "chainFun: Not enough parameters in Val list" 833 833 834 applyExp :: [ApplyArg] -> Exp -> Eval Val835 applyExp bound (Prim f) =834 applyExp :: SubType -> [ApplyArg] -> Exp -> Eval Val 835 applyExp _ bound (Prim f) = 836 836 f [ argValue arg | arg <- bound, (argName arg !! 1) /= '_' ] 837 applyExp [] body = evalExp body838 applyExp bound@(arg:_) body = do837 applyExp _ [] body = evalExp body 838 applyExp styp bound@(arg:_) body = do 839 839 -- introduce $?SELF and $_ as the first invocant. 840 inv <- i nvocant840 inv <- if styp <= SubMethod then invocant else return [] 841 841 pad <- formal 842 842 enterLex (inv ++ pad) $ evalExp body … … 882 882 (`juncApply` bound) $ \realBound -> do 883 883 enterSub sub $ do 884 applyExp realBound fun884 applyExp (subType sub) realBound fun 885 885 retVal val 886 886 where -
src/Pugs/Parser.hs
r3027 r3053 33 33 ruleProgram :: RuleParser Env 34 34 ruleProgram = rule "program" $ do 35 env <- getState 35 36 statements <- ruleBlockBody 36 37 -- error $ show statements 37 38 eof 38 env <- getState 39 return $ env { envBody = mergeStmts emptyExp statements, envStash = "" } 39 env' <- getState 40 return $ env' 41 { envBody = mergeStmts emptyExp statements 42 , envStash = "" 43 , envPackage = envPackage env 44 } 40 45 41 46 ruleBlock :: RuleParser Exp … … 310 315 , subName = name' 311 316 , subPad = envLexical env 312 , subType = SubRoutine317 , subType = if isMethod then SubMethod else SubRoutine 313 318 , subAssoc = "pre" 314 319 , subReturns = mkType typ'' … … 501 506 ruleModuleDeclaration :: RuleParser Exp 502 507 ruleModuleDeclaration = rule "module declaration" $ do 503 symbol "module" <|> symbol "class" 504 n <- ruleQualifiedIdentifier 505 v <- option "" $ ruleVersionPart 506 a <- option "" $ ruleAuthorPart 507 return $ Syn "module" [Val . VStr $ n ++ v ++ a] -- XXX 508 symbol "package" <|> symbol "module" <|> symbol "class" 509 name <- ruleQualifiedIdentifier 510 v <- option "" $ ruleVersionPart 511 a <- option "" $ ruleAuthorPart 512 env <- getState 513 let exp = Syn ":=" [Var (':':name), Syn "\\{}" [Syn "," []]] 514 unsafeEvalExp (Sym SGlobal (':':name) exp) 515 setState env{ envPackage = name, envClasses = envClasses env `addNode` mkType name } 516 return $ Syn "module" [Val . VStr $ name ++ v ++ a] -- XXX 508 517 509 518 ruleVersionPart = do -- version - XXX … … 980 989 , ruleLit 981 990 , ruleClosureTrait True 991 , ruleTypeVar 982 992 , ruleTypeLiteral 983 993 , parseApply … … 987 997 return $ combine (reverse fs) term 988 998 999 ruleTypeVar :: RuleParser Exp 1000 ruleTypeVar = rule "type" $ try $ do 1001 string "::" 1002 name <- ruleQualifiedIdentifier 1003 return . Val . VType $ mkType name 1004 989 1005 ruleTypeLiteral :: RuleParser Exp 990 1006 ruleTypeLiteral = rule "type" $ do 991 1007 env <- getState 992 optional $ string "::"993 1008 name <- tryChoice [ 994 1009 do { symbol n; notFollowedBy (alphaNum <|> char ':'); return n } … … 1196 1211 makeVar ('$':'<':name) = Syn "{}" [Var "$/", doSplitStr (tail name)] 1197 1212 makeVar (sigil:'.':name) = 1213 Cxt (cxtOfSigil sigil) (Syn "{}" [Var "$?SELF", Val (VStr name)]) 1214 makeVar (sigil:':':name) = 1198 1215 Cxt (cxtOfSigil sigil) (Syn "{}" [Var "$?SELF", Val (VStr name)]) 1199 1216 makeVar var = Var var -
src/Pugs/Prim.hs
r3042 r3053 46 46 op0 "|" = fmap opJuncAny . mapM fromVal 47 47 op0 "want" = const $ fmap VStr (asks envWant) 48 op0 "bool::true" = const $ return (VBool True) 49 op0 "bool::false" = const $ return (VBool False) 48 50 op0 "time" = const $ do 49 51 clkt <- liftIO getClockTime … … 431 433 handleOf (VList [x]) = handleOf x 432 434 handleOf v = fromVal v 433 op1 "ref" = fmap (VStr . showType). evalValType435 op1 "ref" = fmap VType . evalValType 434 436 op1 "pop" = \x -> join $ doArray x array_pop -- monadic join 435 437 op1 "shift" = \x -> join $ doArray x array_shift -- monadic join … … 1207 1209 \\n List pre Pugs::Internals::runInteractiveCommand (?Str=$_)\ 1208 1210 \\n List pre Pugs::Internals::openFile (?Str,?Str=$_)\ 1211 \\n Bool pre bool::true ()\ 1212 \\n Bool pre bool::false ()\ 1209 1213 \\n" -
src/Pugs/Prim/Keyed.hs
r2961 r3053 95 95 existsFromRef (MkRef (IScalar sv)) val = do 96 96 refVal <- scalar_fetch sv 97 ref <- fromVal refVal 98 existsFromRef ref val 97 case refVal of 98 VRef ref -> existsFromRef ref val 99 VList _ -> (`existsFromRef` val) =<< fromVal refVal 100 _ -> return False 99 101 existsFromRef ref _ = retError "Not a keyed reference" ref 100 102 … … 116 118 deleteFromRef (MkRef (IScalar sv)) val = do 117 119 refVal <- scalar_fetch sv 118 ref <- fromVal refVal 119 deleteFromRef ref val 120 case refVal of 121 VRef ref -> deleteFromRef ref val 122 VList _ -> (`deleteFromRef` val) =<< fromVal refVal 123 _ -> return undef 120 124 deleteFromRef ref _ = retError "Not a keyed reference" ref
