Changeset 33
- Timestamp:
- 02/17/05 04:57:49 (4 years ago)
- svk:copy_cache_prev:
- 1041
- Location:
- src
- Files:
-
- 7 modified
Legend:
- Unmodified
- Added
- Removed
-
src/AST.hs
r32 r33 126 126 vCast x = MkArray (vCast x) 127 127 128 instance Value MVal where 129 castV ref = unsafePerformIO $ readIORef ref 130 128 131 {- 129 132 instance Value VJunc where … … 139 142 vCast (VUndef) = [] 140 143 vCast v = [v] 144 145 instance Value VIO where 146 castV = VIO 147 doCast (VIO x) = x 141 148 142 149 instance Value (Maybe a) where … … 210 217 | VJunc VJunc 211 218 | VError VStr Exp 219 | VIO VIO 212 220 | VControl VControl 213 221 deriving (Show, Eq, Ord) … … 261 269 instance Ord VComplex where {- ... -} 262 270 instance (Ord a, Ord b) => Ord (FiniteMap a b) 271 instance Ord MVal where 272 compare x y = compare (castV x) (castV y) 273 instance Show MVal where 274 show = show . castV 275 instance Ord VIO where 276 compare x y = compare (show x) (show y) 263 277 264 278 type Var = String 279 type MVal = IORef Val 280 type VIO = Handle 265 281 266 282 data Exp … … 269 285 | Sym Symbol 270 286 | Prim ([Val] -> Eval Val) 287 | MVal MVal 271 288 | Val Val 272 289 | Var Var -
src/Eval.hs
r32 r33 70 70 exp' <- local (\e -> e{ envBody = exp }) reduce 71 71 debug "indent" (tail) " Ret" exp' 72 return $ case exp' of 73 Val v -> v 74 otherwise -> VError "Invalid expression" exp' 72 case exp' of 73 Val v -> return v 74 MVal mv -> liftIO $ readIORef mv 75 otherwise -> return $ VError "Invalid expression" exp' 75 76 76 77 evalExp :: Exp -> Eval Val … … 101 102 retVal val = return $ Val val 102 103 103 reduceStatements :: [Exp] -> Eval Exp 104 reduceStatements [] = retVal VUndef 105 reduceStatements [exp] = do 106 val <- evalExp exp 107 retVal val 108 reduceStatements (exp:rest) 109 | Syn "sym" [Sym sym@(Symbol SGlobal _ _)] <- exp = do 104 newMVal val = do 105 mval <- liftIO $ newIORef val 106 return $ MVal mval 107 108 reduceStatements :: ([Exp], Exp) -> Eval Exp 109 reduceStatements ([], exp) = reduceExp exp 110 reduceStatements ((exp:rest), _) 111 | Syn "sym" [Sym sym@(Symbol _ name (Syn "mval" [_, vexp]))] <- exp = do 112 val <- enterEvalContext (cxtOfSigil $ head name) vexp 113 mval <- newMVal val 114 reduceStatements ((Syn "sym" [Sym sym{ symExp = mval }]:rest), mval) 115 | Syn "sym" [Sym sym@(Symbol SGlobal _ vexp)] <- exp = do 110 116 local (\e -> e{ envGlobal = (sym:envGlobal e) }) $ do 111 reduceStatements rest112 | Syn "sym" [Sym sym@(Symbol SMy _ _)] <- exp = do117 reduceStatements (rest, vexp) 118 | Syn "sym" [Sym sym@(Symbol SMy _ vexp)] <- exp = do 113 119 enterLex [sym] $ do 114 reduceStatements rest115 | Syn syn [Var name, exp'] <- exp120 reduceStatements (rest, vexp) 121 | Syn syn [Var name, vexp] <- exp 116 122 , (syn == ":=" || syn == "::=") = do 117 123 lex <- asks envLexical 118 124 case findSym name lex of 119 125 Just _ -> do 120 let sym = (Symbol SMy name exp')126 let sym = (Symbol SMy name vexp) 121 127 enterLex [sym] $ do 122 reduceStatements rest128 reduceStatements (rest, vexp) 123 129 Nothing -> do 124 let sym = (Symbol SGlobal name exp')130 let sym = (Symbol SGlobal name vexp) 125 131 local (\e -> e{ envGlobal = (sym:envGlobal e) }) $ do 126 reduceStatements rest132 reduceStatements (rest, vexp) 127 133 | otherwise = do 128 134 val <- enterContext "Void" $ evalExp exp 129 135 processVal val $ do 130 reduceStatements rest136 reduceStatements (rest, Val val) 131 137 where 132 138 processVal val action = case val of … … 134 140 _ -> action 135 141 142 findVar Env{ envLexical = lex, envGlobal = glob } name 143 | Just vexp <- findSym name lex 144 = Just vexp 145 | Just vexp <- findSym name glob 146 = Just vexp 147 | Just vexp <- findSym (toGlobal name) glob 148 = Just vexp 149 | otherwise 150 = Nothing 151 136 152 doReduce :: Env -> Exp -> Eval Exp 137 153 154 doReduce env exp@(MVal mval) = 155 retVal =<< liftIO (readIORef mval) 156 138 157 -- Reduction for variables 139 doReduce Env{ envLexical = lex, envGlobal = glob } exp@(Var var) 140 | Just vexp <- findSym var lex 141 = reduceExp vexp 142 | Just vexp <- findSym var glob 143 = reduceExp vexp 144 | Just vexp <- findSym (toGlobal var) glob 158 doReduce env exp@(Var name) 159 | Just vexp <- findVar env name 145 160 = reduceExp vexp 146 161 | otherwise 147 = retVal $ VError ("Undefined variable " ++ var) exp162 = retVal $ VError ("Undefined variable " ++ name) exp 148 163 149 164 -- Reduction for syntactic constructs … … 151 166 ";" -> do 152 167 let (global, local) = partition isGlobalExp exps 153 reduceStatements (global ++ local )168 reduceStatements (global ++ local, Val VUndef) 154 169 "sym" -> do 155 170 let [Sym (Symbol _ _ exp)] = exps 156 171 val <- evalExp exp 157 172 retVal VUndef 173 "mval" -> do 174 let [Var name, exp] = exps 175 val <- enterEvalContext (cxtOfSigil $ head name) exp 176 newMVal val 177 "=" -> do 178 let [Var name, exp] = exps 179 case findVar env name of 180 Nothing -> retVal $ VError ("Undefined variable " ++ name) exp 181 Just (MVal mv) -> do 182 val <- enterEvalContext (cxtOfSigil $ head name) exp 183 liftIO $ writeIORef mv val 184 return (MVal mv) 185 _ -> do 186 retVal $ VError "Can't modify constant item" exp 158 187 ":=" -> do 159 let [Var var, exp] = exps160 val <- enterEvalContext (cxtOfSigil $ head var) exp188 let [Var name, exp] = exps 189 val <- enterEvalContext (cxtOfSigil $ head name) exp 161 190 retVal val 162 191 "::=" -> do -- XXX wrong 163 let [Var var, exp] = exps192 let [Var name, exp] = exps 164 193 val <- evalExp exp 165 194 retVal VUndef -- XXX wrong -
src/Lexer.hs
r32 r33 40 40 braces = P.braces perl6Lexer 41 41 brackets = P.brackets perl6Lexer 42 angles = P.angles perl6Lexer 42 43 43 44 symbol s -
src/Main.hs
r32 r33 85 85 runProgramWith fenv f name args prog = do 86 86 env <- emptyEnv 87 let env' = runRule (prepare $ fenv env) id ruleProgram prog 87 str <- getContents 88 let env' = runRule (prepare str $ fenv env) id ruleProgram prog 88 89 val <- (`runReaderT` env') $ do 89 90 (`runContT` return) $ do … … 91 92 f val 92 93 where 93 prepare e = e{ envGlobal =94 prepare str e = e{ envGlobal = 94 95 [ Symbol SGlobal "@*ARGS" (Val $ VList $ map VStr args) 95 96 , Symbol SGlobal "$*PROGNAME" (Val $ VStr name) 97 , Symbol SGlobal "$*STDIN" (Val $ VStr str) 96 98 ] ++ envGlobal e } 97 99 -
src/Parser.hs
r32 r33 149 149 scope <- ruleScope 150 150 name <- parseVarName 151 exp <- option (Val VUndef) $ do 152 tryChoice $ map symbol $ words " = := ::= " 153 ruleExpression 151 exp <- option (Syn "mval" [Var name, Val VUndef]) $ do 152 sym <- tryChoice $ map symbol $ words " = := ::= " 153 exp <- ruleExpression 154 return $ case sym of 155 "=" -> (Syn "mval" [Var name, exp]) 156 _ -> exp 154 157 return $ Syn "sym" [Sym $ Symbol scope name exp] 155 158 … … 400 403 , namedLiteral "Inf" (VNum $ 1/0) 401 404 , dotdotdotLiteral 402 ] 405 , angleLiteral 406 ] 407 408 angleLiteral = try $ do 409 exp <- angles $ option Nothing $ return . Just =<< parseTerm 410 return $ case exp of 411 Nothing -> App "&prefix:<>" [] [] 412 Just exp -> App "&prefix:<>" [] [exp] 403 413 404 414 numLiteral = do -
src/Pretty.hs
r31 r33 66 66 pretty (VArray (MkArray x)) = pretty (VList x) 67 67 pretty (VHash (MkHash x)) = show x 68 pretty (VIO x) = show x 68 69 pretty VUndef = "undef" 69 70 -
src/Prim.hs
r32 r33 57 57 op1 "print" = \v -> do 58 58 liftIO . putStr . concatMap vCast . vCast $ v 59 return $ V Undef59 return $ VBool True 60 60 op1 "say" = \v -> do 61 liftIO . putStrLn . concatMap vCast. vCast $ v62 return $ V Undef61 liftIO . mapM (putStrLn . vCast) . vCast $ v 62 return $ VBool True 63 63 op1 "die" = \v -> do 64 64 return $ VError (concatMap vCast . vCast $ v) (Val v) … … 67 67 then liftIO $ exitWith (ExitFailure $ vCast v) 68 68 else liftIO $ exitWith ExitSuccess 69 69 -- handle timely destruction 70 op1 "open" = \v -> do 71 fh <- liftIO $ openFile (vCast v) ReadMode 72 return $ VIO fh 73 op1 "close" = \v -> do 74 liftIO $ hClose (vCast v) 75 return $ VBool True 76 op1 "<>" = \v -> do 77 str <- readFrom v 78 cxt <- asks envContext 79 return $ if ((cxt ==) `any` ["Array", "List"]) -- XXX use isaType here 80 then VList $ map VStr $ lines str 81 else VStr str 82 where 83 readFrom VUndef = do 84 -- ARGS etc 85 glob <- asks envGlobal 86 strs <- liftIO $ sequence $ case find ((== "@*ARGS") . symName) glob of 87 Nothing -> [getStdin glob] 88 Just sym -> case symExp sym of 89 Val (VList []) -> [getStdin glob] 90 Val (VList xs) -> map ((hGetContents =<<) . (`openFile` ReadMode) . vCast) xs 91 _ -> error "not handled" 92 return $ concat strs 93 readFrom v = do 94 liftIO $ hGetContents $ vCast v 95 getStdin glob = do 96 case find ((== "$*STDIN") . symName) glob of 97 Just sym | (Val v) <- symExp sym -> return $ vCast v 98 _ -> error "impossible" 70 99 op1 s = return . (\x -> VError ("unimplemented unaryOp: " ++ s) (Val x)) 71 100 … … 272 301 \\n Action pre die (List)\ 273 302 \\n Any pre do (Str)\ 303 \\n IO pre open (Str)\ 274 304 \\n Any pre return (Any)\ 305 \\n Any pre <> ()\ 275 306 \\n Junction pre any (List)\ 276 307 \\n Junction pre all (List)\
