Changeset 14321 for src/Pugs/Prim.hs

Show
Ignore:
Timestamp:
10/17/06 08:25:00 (2 years ago)
Author:
gaal
svk:copy_cache_prev:
21206
Message:

* Primitive golf and cleanups

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim.hs

    r14315 r14321  
    6565-- (including list ops). 
    6666op0 :: String -> [Val] -> Eval Val 
    67 op0 "&"  = fmap opJuncAll  . mapM fromVal 
    68 op0 "^"  = fmap opJuncOne  . mapM fromVal 
    69 op0 "|"  = fmap opJuncAny  . mapM fromVal 
     67op0 "&"  = fmap opJuncAll . mapM fromVal 
     68op0 "^"  = fmap opJuncOne . mapM fromVal 
     69op0 "|"  = fmap opJuncAny . mapM fromVal 
    7070op0 "want"  = const $ fmap VStr (asks (maybe "Void" envWant . envCaller)) 
    71 op0 "Bool::True" = const . return $ VBool True 
     71op0 "Bool::True"  = const . return $ VBool True 
    7272op0 "Bool::False" = const . return $ VBool False 
    73 op0 "True" = constMacro . Val $ VBool True 
     73op0 "True"  = constMacro . Val $ VBool True 
    7474op0 "False" = constMacro . Val $ VBool False 
    7575op0 "time"  = const $ do 
     
    9696    return $ VStr tmp 
    9797op0 "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 retEmpty 
     98op0 "self"    = const $ expToEvalVal (_Var "&self") 
     99op0 "say"     = const $ op1 "IO::say" (VHandle stdout) 
     100op0 "print"   = const $ op1 "IO::print" (VHandle stdout) 
     101op0 "return"  = const $ op1Return (retControl (ControlLeave (<= SubRoutine) 0 undef)) 
     102op0 "yield"   = const $ op1Yield (retControl (ControlLeave (<= SubRoutine) 0 undef)) 
     103op0 "leave"   = const $ retControl (ControlLeave (>= SubBlock) 0 undef) 
     104op0 "take"    = const $ assertFrame FrameGather retEmpty 
    105105op0 "nothing" = const . return $ VBool True 
    106 op0 "Pugs::Safe::safe_getc" = const . op1Getc $ VHandle stdin 
     106op0 "Pugs::Safe::safe_getc"     = const . op1Getc $ VHandle stdin 
    107107op0 "Pugs::Safe::safe_readline" = const . op1Readline $ VHandle stdin 
    108108op0 "reverse" = const $ return (VList []) 
    109 op0 "chomp" = const $ return (VList []) 
    110 op0 "fork"  = const $ opPerl5 "fork" [] 
     109op0 "chomp"   = const $ return (VList []) 
     110op0 "fork"    = const $ opPerl5 "fork" [] 
    111111op0 other = const $ fail ("Unimplemented listOp: " ++ other) 
    112112 
     
    116116op1 "WHICH" = \x -> do 
    117117    val <- fromVal x 
    118     case val of 
    119         VObject o   -> return . castV . unObjectId $ objId o 
    120         _           -> return val 
     118    return $ case val of 
     119        VObject o   -> castV . unObjectId $ objId o 
     120        _           -> val 
    121121op1 "chop" = \x -> do 
    122122    str <- fromVal x 
    123     if null str 
    124         then return $ VStr str 
    125         else return $ VStr $ init str 
     123    return $ if null str 
     124        then VStr str 
     125        else VStr $ init str 
    126126op1 "Scalar::chomp" = \x -> do 
    127127    str <- fromVal x 
    128128    return $ op1Chomp str 
    129129op1 "Str::split" = op1Cast (castV . words) 
    130 op1 "lc" = op1Cast (VStr . map toLower) 
    131 op1 "lcfirst" = op1StrFirst toLower 
    132 op1 "uc" = op1Cast (VStr . map toUpper) 
    133 op1 "ucfirst" = op1StrFirst toUpper 
     130op1 "lc"         = op1Cast (VStr . map toLower) 
     131op1 "lcfirst"    = op1StrFirst toLower 
     132op1 "uc"         = op1Cast (VStr . map toUpper) 
     133op1 "ucfirst"    = op1StrFirst toUpper 
    134134op1 "capitalize" = op1Cast $ VStr . (mapEachWord capitalizeWord) 
    135135  where 
     
    277277    str <- fromVal v 
    278278    opEval quiet "<eval>" (encodeUTF8 str) 
    279     where quiet = MkEvalStyle{evalResult=EvalResultLastValue 
    280                              ,evalError=EvalErrorUndef} 
     279    where quiet = MkEvalStyle { evalResult = EvalResultLastValue 
     280                              , evalError  = EvalErrorUndef } 
    281281op1 "evalfile" = \v -> do 
    282282    filename <- fromVal v 
     
    345345    x <- fromVal v 
    346346    guardSTM . unsafeIOToSTM $ do 
    347        seed <- if ( defined v ) 
     347       seed <- if defined v 
    348348          then return x 
    349349          else randomRIO (0, 2^(31::Int)) 
     
    581581    _           -> op1 "readline" v 
    582582op1 "readline" = op1Readline 
    583  
    584583op1 "getc"     = op1Getc 
    585  
    586 op1 "WHAT"   = fmap VType . evalValType 
     584op1 "WHAT"     = fmap VType . evalValType 
    587585op1 "List::end"   = \x -> fmap (castV . pred) (join $ doArray x array_fetchSize) -- monadic join 
    588586op1 "List::elems" = \x -> fmap castV (join $ doArray x array_fetchSize) -- monadic join 
     
    778776op1Exit v = do 
    779777    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 
    783780 
    784781op1StrFirst :: (Char -> Char) -> Val -> Eval Val 
     
    973970op2 "~~" = op2Match 
    974971op2 "=:=" = \x y -> do 
    975     case x of 
    976         VRef xr | VRef yr <- y -> do 
     972    return $ castV $ case x of 
     973        VRef xr | VRef yr <- y -> 
    977974            -- Take advantage of the pointer address built-in with (Show VRef) 
    978             return $ castV (show xr == show yr) 
    979         _   -> do 
    980             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#) 
    981978op2 "===" = \x y -> do 
    982979    return $ castV (x == y) 
     
    10351032    rv  <- deleteFromRef ref y 
    10361033    -- S29: delete always returns the full list regardless of context. 
    1037     case rv of 
    1038         VList [x]   -> return x 
    1039         _           -> return rv 
     1034    return $ case rv of 
     1035        VList [x]   -> x 
     1036        _           -> rv 
    10401037op2 "exists" = \x y -> do 
    10411038    ref <- fromVal x 
     
    10621059        hSetBuffering h NoBuffering 
    10631060        return h 
    1064     return $ VHandle $ hdl 
     1061    return $ VHandle hdl 
    10651062    where 
    10661063    modeOf "r"  = ReadMode 
     
    16971694    rv      <- prettyVal v 
    16981695    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 
    17021697 
    17031698prettyVal :: (?seen :: IntSet.IntSet, ?recur :: TVar Bool, ?printer :: PrettyPrinter) => Val -> Eval VStr