Changeset 14321 for src/Pugs/Prim.hs
- Timestamp:
- 10/17/06 08:25:00 (2 years ago)
- svk:copy_cache_prev:
- 21206
- Files:
-
- 1 modified
-
src/Pugs/Prim.hs (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim.hs
r14315 r14321 65 65 -- (including list ops). 66 66 op0 :: String -> [Val] -> Eval Val 67 op0 "&" = fmap opJuncAll . mapM fromVal68 op0 "^" = fmap opJuncOne . mapM fromVal69 op0 "|" = fmap opJuncAny . mapM fromVal67 op0 "&" = fmap opJuncAll . mapM fromVal 68 op0 "^" = fmap opJuncOne . mapM fromVal 69 op0 "|" = fmap opJuncAny . mapM fromVal 70 70 op0 "want" = const $ fmap VStr (asks (maybe "Void" envWant . envCaller)) 71 op0 "Bool::True" = const . return $ VBool True71 op0 "Bool::True" = const . return $ VBool True 72 72 op0 "Bool::False" = const . return $ VBool False 73 op0 "True" = constMacro . Val $ VBool True73 op0 "True" = constMacro . Val $ VBool True 74 74 op0 "False" = constMacro . Val $ VBool False 75 75 op0 "time" = const $ do … … 96 96 return $ VStr tmp 97 97 op0 "Pugs::Internals::pi" = const $ return $ VNum pi 98 op0 "self" = const $ expToEvalVal (_Var "&self")99 op0 "say" = const $ op1 "IO::say" (VHandle stdout)100 op0 "print" = const $ op1 "IO::print" (VHandle stdout)101 op0 "return" = const $ op1Return (retControl (ControlLeave (<= SubRoutine) 0 undef))102 op0 "yield" = const $ op1Yield (retControl (ControlLeave (<= SubRoutine) 0 undef))103 op0 "leave" = const $ retControl (ControlLeave (>= SubBlock) 0 undef)104 op0 "take" = const $ assertFrame FrameGather retEmpty98 op0 "self" = const $ expToEvalVal (_Var "&self") 99 op0 "say" = const $ op1 "IO::say" (VHandle stdout) 100 op0 "print" = const $ op1 "IO::print" (VHandle stdout) 101 op0 "return" = const $ op1Return (retControl (ControlLeave (<= SubRoutine) 0 undef)) 102 op0 "yield" = const $ op1Yield (retControl (ControlLeave (<= SubRoutine) 0 undef)) 103 op0 "leave" = const $ retControl (ControlLeave (>= SubBlock) 0 undef) 104 op0 "take" = const $ assertFrame FrameGather retEmpty 105 105 op0 "nothing" = const . return $ VBool True 106 op0 "Pugs::Safe::safe_getc" = const . op1Getc $ VHandle stdin106 op0 "Pugs::Safe::safe_getc" = const . op1Getc $ VHandle stdin 107 107 op0 "Pugs::Safe::safe_readline" = const . op1Readline $ VHandle stdin 108 108 op0 "reverse" = const $ return (VList []) 109 op0 "chomp" = const $ return (VList [])110 op0 "fork" = const $ opPerl5 "fork" []109 op0 "chomp" = const $ return (VList []) 110 op0 "fork" = const $ opPerl5 "fork" [] 111 111 op0 other = const $ fail ("Unimplemented listOp: " ++ other) 112 112 … … 116 116 op1 "WHICH" = \x -> do 117 117 val <- fromVal x 118 case val of119 VObject o -> return .castV . unObjectId $ objId o120 _ -> returnval118 return $ case val of 119 VObject o -> castV . unObjectId $ objId o 120 _ -> val 121 121 op1 "chop" = \x -> do 122 122 str <- fromVal x 123 if null str124 then return $VStr str125 else return $VStr $ init str123 return $ if null str 124 then VStr str 125 else VStr $ init str 126 126 op1 "Scalar::chomp" = \x -> do 127 127 str <- fromVal x 128 128 return $ op1Chomp str 129 129 op1 "Str::split" = op1Cast (castV . words) 130 op1 "lc" = op1Cast (VStr . map toLower)131 op1 "lcfirst" = op1StrFirst toLower132 op1 "uc" = op1Cast (VStr . map toUpper)133 op1 "ucfirst" = op1StrFirst toUpper130 op1 "lc" = op1Cast (VStr . map toLower) 131 op1 "lcfirst" = op1StrFirst toLower 132 op1 "uc" = op1Cast (VStr . map toUpper) 133 op1 "ucfirst" = op1StrFirst toUpper 134 134 op1 "capitalize" = op1Cast $ VStr . (mapEachWord capitalizeWord) 135 135 where … … 277 277 str <- fromVal v 278 278 opEval quiet "<eval>" (encodeUTF8 str) 279 where quiet = MkEvalStyle {evalResult=EvalResultLastValue280 ,evalError=EvalErrorUndef}279 where quiet = MkEvalStyle { evalResult = EvalResultLastValue 280 , evalError = EvalErrorUndef } 281 281 op1 "evalfile" = \v -> do 282 282 filename <- fromVal v … … 345 345 x <- fromVal v 346 346 guardSTM . unsafeIOToSTM $ do 347 seed <- if ( defined v )347 seed <- if defined v 348 348 then return x 349 349 else randomRIO (0, 2^(31::Int)) … … 581 581 _ -> op1 "readline" v 582 582 op1 "readline" = op1Readline 583 584 583 op1 "getc" = op1Getc 585 586 op1 "WHAT" = fmap VType . evalValType 584 op1 "WHAT" = fmap VType . evalValType 587 585 op1 "List::end" = \x -> fmap (castV . pred) (join $ doArray x array_fetchSize) -- monadic join 588 586 op1 "List::elems" = \x -> fmap castV (join $ doArray x array_fetchSize) -- monadic join … … 778 776 op1Exit v = do 779 777 rv <- fromVal v 780 if rv /= 0 781 then retControl . ControlExit . ExitFailure $ rv 782 else retControl . ControlExit $ ExitSuccess 778 retControl . ControlExit $ if rv /= 0 779 then ExitFailure rv else ExitSuccess 783 780 784 781 op1StrFirst :: (Char -> Char) -> Val -> Eval Val … … 973 970 op2 "~~" = op2Match 974 971 op2 "=:=" = \x y -> do 975 case x of976 VRef xr | VRef yr <- y -> do972 return $ castV $ case x of 973 VRef xr | VRef yr <- y -> 977 974 -- Take advantage of the pointer address built-in with (Show VRef) 978 return $ castV (show xr == show yr)979 _ -> do980 return $ castV (W# (unsafeCoerce# x :: Word#) == W# (unsafeCoerce# y :: Word#))975 show xr == show yr 976 _ -> 977 W# (unsafeCoerce# x :: Word#) == W# (unsafeCoerce# y :: Word#) 981 978 op2 "===" = \x y -> do 982 979 return $ castV (x == y) … … 1035 1032 rv <- deleteFromRef ref y 1036 1033 -- S29: delete always returns the full list regardless of context. 1037 case rv of1038 VList [x] -> returnx1039 _ -> r eturn rv1034 return $ case rv of 1035 VList [x] -> x 1036 _ -> rv 1040 1037 op2 "exists" = \x y -> do 1041 1038 ref <- fromVal x … … 1062 1059 hSetBuffering h NoBuffering 1063 1060 return h 1064 return $ VHandle $hdl1061 return $ VHandle hdl 1065 1062 where 1066 1063 modeOf "r" = ReadMode … … 1697 1694 rv <- prettyVal v 1698 1695 isRecur <- liftSTM (readTVar recur) 1699 if isRecur 1700 then return (VStr $ decodeUTF8 ("$_ := " ++ rv)) 1701 else return (VStr $ decodeUTF8 rv) 1696 return $ VStr $ decodeUTF8 $ if isRecur then "$_ := " ++ rv else rv 1702 1697 1703 1698 prettyVal :: (?seen :: IntSet.IntSet, ?recur :: TVar Bool, ?printer :: PrettyPrinter) => Val -> Eval VStr
