Changeset 202
- Timestamp:
- 02/23/05 17:00:46 (4 years ago)
- svk:copy_cache_prev:
- 1041
- Files:
-
- 2 added
- 6 modified
-
lib/Perl6/lib (added)
-
lib/Perl6/lib/Test.pm (added)
-
src/AST.hs (modified) (2 diffs)
-
src/Eval.hs (modified) (7 diffs)
-
src/Internals.hs (modified) (2 diffs)
-
src/Main.hs (modified) (2 diffs)
-
src/Parser.hs (modified) (7 diffs)
-
src/Prim.hs (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST.hs
r196 r202 195 195 vCast _ = Just undefined 196 196 197 instance Value Int where doCast = intCast 197 instance Value Int where 198 doCast = intCast 199 castV = VInt . fromIntegral 198 200 instance Value Word where doCast = intCast 199 201 instance Value Word8 where doCast = intCast … … 356 358 | Sym Symbol 357 359 | Prim ([Val] -> Eval Val) 358 -- | MVal MVal359 360 | Val Val 360 361 | Var Var 361 362 | Parens Exp 362 363 | NonTerm SourcePos 363 | Parser (CharParser Env Exp)364 | Statements [(Exp, SourcePos)] 364 365 deriving (Show, Eq, Ord) 365 366 -
src/Eval.hs
r201 r202 60 60 evaluateMain :: Exp -> Eval Val 61 61 evaluateMain exp = do 62 val <- evaluate exp 63 evalVar "$*END" 62 val <- evaluate exp 63 endAV <- evalVar "@*END" 64 subs <- readMVal endAV 65 enterContext "Void" $ do 66 mapM_ evalExp [ Syn "()" [Val sub, Syn "invs" [], Syn "args" []] | sub <- vCast subs ] 64 67 return val 65 68 … … 138 141 writeIORef glob (sym:syms) 139 142 140 reduceStatements :: ([ Exp], Exp) -> Eval Val143 reduceStatements :: ([(Exp, SourcePos)], Exp) -> Eval Val 141 144 reduceStatements ([], exp) = reduceExp exp 142 reduceStatements (( exp:rest), lastVal)145 reduceStatements (((exp, pos):rest), lastVal) 143 146 | Syn "sym" (Sym sym@(Symbol _ _ vexp@(Syn "sub" [sub])):other) <- exp = do 144 147 (VSub sub) <- enterEvalContext "Code" vexp 145 148 lex <- asks envLexical 146 reduceStatements (( Syn "sym" (other ++ [Sym sym{ symExp = Val $ VSub sub{ subPad = lex } }]):rest), lastVal)149 reduceStatements (((Syn "sym" (other ++ [Sym sym{ symExp = Val $ VSub sub{ subPad = lex } }]), pos):rest), lastVal) 147 150 | Syn "sym" (Sym sym@(Symbol _ name (Syn "mval" [_, vexp])):other) <- exp = do 148 151 val <- enterEvalContext (cxtOfSigil $ head name) vexp 149 152 mval <- newMVal val 150 reduceStatements (( Syn "sym" (other ++ [Sym sym{ symExp = Val mval }]):rest), Val mval)153 reduceStatements (((Syn "sym" (other ++ [Sym sym{ symExp = Val mval }]), pos):rest), Val mval) 151 154 | Syn "sym" [Sym sym@(Symbol SGlobal _ vexp)] <- exp = do 152 155 addGlobalSym sym … … 173 176 -- bare Block in statement level; run it! 174 177 let app = Syn "()" [exp, Syn "invs" [], Syn "args" []] 175 reduceStatements ( app:rest, lastVal)178 reduceStatements ((app, pos):rest, lastVal) 176 179 | null rest = do 177 180 cxt <- asks envContext 178 val <- reduceExp exp181 val <- enterLex (posSyms pos) $ reduceExp exp 179 182 retVal val 180 183 | otherwise = do 181 val <- enterContext "Void" $ evalExp exp 184 val <- enterContext "Void" $ do 185 enterLex (posSyms pos) $ do 186 reduceExp exp 182 187 processVal val $ do 183 188 reduceStatements (rest, Val val) 184 where 189 where 185 190 processVal val action = case val of 186 191 VError str exp -> retError str exp 187 192 _ -> action 193 194 posSyms pos = [ Symbol SMy n (Val v) | (n, v) <- syms ] 195 where 196 file = sourceName pos 197 line = show $ sourceLine pos 198 col = show $ sourceColumn pos 199 syms = 200 [ ("$?FILE", castV file) 201 , ("$?LINE", castV line) 202 , ("$?POSITION", castV $ file ++ " at line " ++ line ++ ", column " ++ col) 203 ] 188 204 189 205 evalVar name = do … … 203 219 204 220 findVar name 205 | (sig:"CALLER", name') <- breakOnGlue "::" name = do 221 | (package, name') <- breakOnGlue "::" name 222 , (sig, "CALLER") <- breakOnGlue "CALLER" package = do 206 223 rv <- asks envCaller 207 224 case rv of 208 Just caller -> findVar' caller (sig :(drop 2 name'))225 Just caller -> findVar' caller (sig ++ (drop 2 name')) 209 226 Nothing -> retError "cannot access CALLER:: in top level" (Var name) 210 227 | otherwise = do … … 249 266 _ -> retError ("Undefined variable " ++ name) exp 250 267 268 reduce env (Statements stmts) = do 269 let (global, local) = partition isGlobalExp stmts 270 reduceStatements (global ++ local, Val VUndef) 271 where 272 isGlobalExp (Syn name _, _) = name `elem` (words "::=") 273 isGlobalExp _ = False 274 251 275 -- Reduction for syntactic constructs 252 276 reduce env@Env{ envContext = cxt } exp@(Syn name exps) = case name of 253 ";" -> do254 let (global, local) = partition isGlobalExp exps255 reduceStatements (global ++ local, Val VUndef)256 277 "sub" -> do 257 278 let [exp] = exps … … 280 301 let [pre, cond, post, body] = exps 281 302 evalExp pre 282 -- enter the block283 -- first, run pre and enter its lexical context284 -- reduceStatements (pre:, Val VUndef)285 303 let runBody = do 286 304 valBody <- evalExp body … … 521 539 | otherwise = name 522 540 523 isGlobalExp (Syn name _) = name `elem` (words "::=")524 isGlobalExp _ = False525 541 526 542 findSym :: String -> Pad -> Maybe Exp -
src/Internals.hs
r167 r202 17 17 module Cont, 18 18 module Posix, 19 module Rule.Pos, 19 20 module Data.Dynamic, 20 21 module Data.Unique, … … 71 72 import Data.IORef 72 73 import Debug.Trace 74 import Rule.Pos 73 75 74 76 -- Instances. -
src/Main.hs
r200 r202 74 74 doParse prog = do 75 75 env <- emptyEnv [] 76 runRule env (putStrLn . pretty) ruleProgram prog76 runRule env (putStrLn . pretty) ruleProgram "<interactive>" prog 77 77 78 78 doEval :: [String] -> String -> IO () … … 97 97 runProgramWith fenv f name args prog = do 98 98 environ <- getEnvironment 99 progSV <- newMVal $ VStr name 100 endAV <- newMVal $ VList [] 101 incAV <- newMVal $ VList [] 102 argsAV <- newMVal $ VList (map VStr args) 103 inGV <- newMVal $ VHandle stdin 104 outGV <- newMVal $ VHandle stdout 105 errGV <- newMVal $ VHandle stderr 99 106 env <- emptyEnv 100 [ Symbol SGlobal "@*ARGS" (Val $ VList $ map VStr args) 101 , Symbol SGlobal "@*INC" (Val $ VList []) 102 , Symbol SGlobal "$*PROGNAME" (Val $ VStr name) 103 -- , Symbol SGlobal "$*STDIN" (Val $ VStr str) 104 , Symbol SGlobal "@*END" (Val VUndef) 107 [ Symbol SGlobal "@*ARGS" $ Val argsAV 108 , Symbol SGlobal "@*INC" $ Val incAV 109 , Symbol SGlobal "$*PROGNAME" $ Val progSV 110 , Symbol SGlobal "@*END" $ Val endAV 111 , Symbol SGlobal "$*IN" $ Val inGV 112 , Symbol SGlobal "$*OUT" $ Val outGV 113 , Symbol SGlobal "$*ERR" $ Val errGV 105 114 , Symbol SGlobal "%*ENV" (Val . VHash . MkHash . listToFM $ [ (VStr k, VStr v) | (k, v) <- environ ]) 106 115 ] 107 116 -- str <- return "" -- getContents 108 let env' = runRule (fenv env) id ruleProgram prog117 let env' = runRule (fenv env) id ruleProgram name prog 109 118 val <- (`runReaderT` env') $ do 110 119 (`runContT` return) $ resetT $ do -
src/Parser.hs
r200 r202 28 28 eof 29 29 env <- getState 30 return $ env { envBody = S yn ";"statements }30 return $ env { envBody = Statements statements } 31 31 32 32 ruleBlock :: RuleParser Exp … … 36 36 statements <- option [] ruleStatementList 37 37 many (symbol ";") 38 ret Syn ";"statements39 40 ruleStatementList :: RuleParser [ Exp]38 return $ Statements statements 39 40 ruleStatementList :: RuleParser [(Exp, SourcePos)] 41 41 ruleStatementList = rule "statements" $ choice 42 42 [ nonSep ruleDeclaration … … 48 48 semiSep = doSep many1 49 49 doSep count rule = do 50 pos <- getPosition 50 51 statement <- rule 51 52 rest <- option [] $ try $ do { count (symbol ";"); ruleStatementList } 52 return ( statement:rest)53 return ((statement, pos):rest) 53 54 54 55 -- Declarations ------------------------------------------------ … … 92 93 , ruleSubGlobal 93 94 ] 94 cxt2 <- option cxt1 $ ruleBareTrait "returns"95 95 formal <- option Nothing $ return . Just =<< parens ruleSubParameters 96 cxt2 <- option cxt1 $ try $ ruleBareTrait "returns" 96 97 traits <- many $ ruleTrait 97 98 body <- ruleBlock … … 209 210 , subFun = fun 210 211 } 211 return $ App "&prefix: push" [Var "@*END"] [Syn "sub" [Val $ VSub sub]]212 return $ App "&prefix:unshift" [] [Syn "," [Var "@*END", Syn "sub" [Val $ VSub sub]]] 212 213 213 214 rulePackageDeclaration = rule "package declaration" $ fail "" … … 615 616 ternOps _ = [] 616 617 617 runRule :: Env -> (Env -> a) -> RuleParser Env -> String -> a618 runRule env f p str = f $ case ( runParser ruleProgram env progName str ) of618 runRule :: Env -> (Env -> a) -> RuleParser Env -> FilePath -> String -> a 619 runRule env f p name str = f $ case ( runParser ruleProgram env name str ) of 619 620 Left err -> env { envBody = Val $ VError (showErr err) (NonTerm $ errorPos err) } 620 621 Right env' -> env' 621 where622 glob = unsafePerformIO $ readIORef $ envGlobal env623 progName624 | Just Symbol{ symExp = Val (VStr str) } <- find ((== "$*PROGNAME") . symName) glob625 = str626 | otherwise627 = "-"628 622 629 623 showErr err = … … 636 630 return $ Syn sym args 637 631 638 retParser :: RuleParser Exp -> RuleParser Exp639 retParser parser = do640 return $ Parser parser641 -
src/Prim.hs
r200 r202 89 89 rand <- liftIO $ randomRIO (0, if x == 0 then 1 else x) 90 90 return $ VNum rand 91 op1 "print" = \v -> do 92 v <- readMVal v 93 vals <- mapM readMVal (vCast v) 94 liftIO . putStr . concatMap vCast $ vals 95 return $ VBool True 96 op1 "say" = \v -> do 97 op1 "print" v 98 liftIO $ putStrLn "" 99 return $ VBool True 91 op1 "print" = op1Print hPutStr 92 op1 "say" = op1Print hPutStrLn 100 93 op1 "join"= \v -> do 101 94 v <- readMVal v … … 163 156 op1 s = return . (\x -> VError ("unimplemented unaryOp: " ++ s) (Val x)) 164 157 158 op1Print f v = do 159 val <- readMVal v 160 vals <- mapM readMVal (vCast val) 161 let (handle, vs) = case vals of 162 (VHandle h:vs) -> (h, vs) 163 _ -> (stdout, vals) 164 liftIO . f handle . concatMap vCast $ vs 165 return $ VBool True 166 165 167 bool2n v = if v 166 168 then 1 … … 186 188 opEval str = do 187 189 env <- ask 188 let env' = runRule env id ruleProgram str190 let env' = runRule env id ruleProgram "<eval>" str 189 191 val <- resetT $ local (\_ -> env') $ do 190 192 evl <- asks envEval … … 261 263 op2 "grep"= op2Grep 262 264 op2 "map"= op2Map 265 op2 "unshift" = op2Push (flip (++)) 266 op2 "push" = op2Push (++) 263 267 op2 "split"= \x y -> return $ split (vCast x) (vCast y) 264 268 where … … 276 280 | otherwise = (x:piece, rest') where (piece, rest') = breakOnGlue glue xs 277 281 op2 s = \x y -> return $ VError ("unimplemented binaryOp: " ++ s) (App s [] [Val x, Val y]) 282 283 op2Push f list _ = do 284 let (array:rest) = vCast list 285 old <- readMVal array 286 new <- mapM readMVal rest 287 let vals = vCast old `f` concatMap vCast new 288 liftIO $ writeIORef (vCast array) $ VList vals 289 return $ VInt $ genericLength vals 278 290 279 291 op2Grep list sub@(VSub _) = op2Grep sub list … … 447 459 \\n List pre map (List: Code)\ 448 460 \\n List pre grep (List: Code)\ 449 \\n Int pre push (rw!Array :List)\450 \\n Int pre unshift (rw!Array :List)\461 \\n Int pre push (rw!Array, List)\ 462 \\n Int pre unshift (rw!Array, List)\ 451 463 \\n Scalar pre pop (rw!Array)\ 452 464 \\n Scalar pre shift (rw!Array)\ … … 465 477 \\n Num pre time ()\ 466 478 \\n Action pre print (List)\ 479 \\n Action pre say (IO: List)\ 467 480 \\n Action pre say (List)\ 468 481 \\n Action pre die (List)\
