Changeset 26 for src/Eval.hs
- Timestamp:
- 02/14/05 06:02:18 (4 years ago)
- svk:copy_cache_prev:
- 1041
- Files:
-
- 1 modified
-
src/Eval.hs (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Eval.hs
r25 r26 22 22 import Monad 23 23 24 emptyEnv = Env { envContext = "List" 25 , envPad = [initSyms] 26 , envClasses = initTree 27 , envEval = evaluate 28 } 29 30 addSym :: Symbols -> StateEnv () 31 addSym syms = modify doAddSyms 32 where 33 doAddSyms env@Env{ envPad = (pad:outer) } = env{ envPad = ((syms++pad):outer) } 34 35 pushPad :: Symbols -> StateEnv () 36 pushPad syms = modify (\env -> env{ envPad = tail $ envPad env }) 37 38 popPad :: StateEnv () 39 popPad = modify (\env -> env{ envPad = tail $ envPad env }) 40 41 evaluate :: Exp -> StateEnv Val 24 emptyEnv :: (MonadIO m) => m Env 25 emptyEnv = do 26 uniq <- liftIO newUnique 27 return $ Env 28 { envContext = "List" 29 , envPad = initSyms 30 , envClasses = initTree 31 , envEval = evaluate 32 , envCC = return 33 , envDepth = 0 34 , envID = uniq 35 , envBody = Val VUndef 36 } 37 38 evaluate :: Exp -> Eval Val 42 39 evaluate exp = do 43 val <- reduce exp40 val <- local (\e -> e { envBody = exp }) reduce 44 41 return $ case val of 45 42 Val v -> v 46 43 otherwise -> VError "Invalid expression" exp 47 44 45 evalEnv :: Exp -> Eval Val 46 evalEnv exp = do 47 evl <- asks envEval 48 evl exp 49 50 evalEnvWithContext :: Cxt -> Exp -> Eval Val 51 evalEnvWithContext cxt exp = do 52 local (\e -> e { envContext = cxt }) $ evalEnv exp 53 54 -- addSym :: Pad -> Eval () 55 addSym syms f = local doAddSyms f 56 where 57 doAddSyms env@Env{ envPad = pad } = env{ envPad = syms++pad } 58 48 59 -- OK... Now let's implement the hideously clever autothreading algorithm. 49 60 -- First pass - thread thru all() and none() 50 61 -- Second pass - thread thru any() and one() 51 62 52 chainFun :: Params -> Exp -> Params -> Exp -> [Val] -> StateEnvVal63 chainFun :: Params -> Exp -> Params -> Exp -> [Val] -> Eval Val 53 64 chainFun p1 f1 p2 f2 (v1:v2:vs) = do 54 65 val <- applyFun (chainArgs p1 [v1, v2]) f1 … … 60 71 chainArg (p, v) = ApplyArg (paramName p) v False 61 72 62 applyFun :: [ApplyArg] -> Exp -> StateEnvVal73 applyFun :: [ApplyArg] -> Exp -> Eval Val 63 74 applyFun bound (Prim f) 64 75 = f [ argValue arg | arg <- bound, (argName arg !! 1) /= '_' ] 65 76 applyFun bound body = do 66 pushPad formal 67 exp <- reduce body 68 return $ case exp of 69 Val val -> val 70 otherwise -> VError "Invalid expression" exp 77 -- pushPad formal 78 evalEnv body 71 79 where 72 80 formal = filter (not . null . symName) $ map argNameValue bound 73 81 argNameValue (ApplyArg name val _) = Symbol SMy name val 74 82 75 apply :: VSub -> [Exp] -> [Exp] -> StateEnvExp83 apply :: VSub -> [Exp] -> [Exp] -> Eval Exp 76 84 apply sub invs args = do 77 env <- get85 env <- ask 78 86 doApply env sub invs args 79 87 80 doApply :: Env -> VSub -> [Exp] -> [Exp] -> StateEnvExp88 doApply :: Env -> VSub -> [Exp] -> [Exp] -> Eval Exp 81 89 doApply env@Env{ envClasses = cls } Sub{ subParams = prms, subFun = fun } invs args = 82 90 case bindParams prms invs args of … … 100 108 | otherwise = False 101 109 102 evalEnv exp = do103 evl <- gets envEval104 evl exp105 106 evalEnvWithContext newCxt exp = do107 Env{ envContext = cxt, envEval = evl } <- get108 modify (\env -> env{ envContext = newCxt })109 val <- evl exp110 modify (\env -> env{ envContext = cxt })111 return val112 113 110 toGlobal name 114 111 | (sigil, identifier) <- break (\x -> isAlpha x || x == '_') name … … 117 114 | otherwise = name 118 115 119 retVal :: Val -> StateEnvExp116 retVal :: Val -> Eval Exp 120 117 retVal val = return $ Val val 121 118 … … 123 120 isGlobalExp _ = False 124 121 125 findSym :: String -> [Symbols]-> Maybe Val122 findSym :: String -> Pad -> Maybe Val 126 123 findSym name pad 127 | Just s <- find ((== name) . symName) (concat pad)124 | Just s <- find ((== name) . symName) pad 128 125 = Just $ symValue s 129 126 | otherwise 130 127 = Nothing 131 128 132 reduce :: E xp -> StateEnvExp133 reduce exp= do134 env <- get135 doReduce env exp129 reduce :: Eval Exp 130 reduce = do 131 env@Env{ envBody = body } <- ask 132 doReduce env body 136 133 137 134 doReduce Env{ envPad = pad } exp@(Var var _) … … 152 149 let [Var var _, exp] = exps 153 150 val <- evalEnv exp 154 addSym [Symbol SMy var val] -- XXX scope151 -- addSym [Symbol SMy var val] -- XXX scope 155 152 retVal val 156 153 "::=" -> do -- XXX wrong 157 154 let [Var var _, exp] = exps 158 155 val <- evalEnv exp 159 addSym [Symbol SMy var val] -- XXX scope156 -- addSym [Symbol SMy var val] -- XXX scope 160 157 retVal VUndef 161 158 "=>" -> do … … 234 231 , fromJust fun 235 232 ) 236 | ((Symbol _ n val), order) <- concatpad `zip` [0..]233 | ((Symbol _ n val), order) <- pad `zip` [0..] 237 234 , let sub@(Sub{ subType = subT, subReturns = ret, subParams = prms }) = vCast val 238 235 , (n ==) `any` [name, toGlobal name] … … 250 247 deltaFromScalar x = deltaType cls x "Scalar" 251 248 252 doReduce _ (Parens exp) = reduceexp249 doReduce env (Parens exp) = doReduce env exp 253 250 doReduce _ other = return other 254 251
