Changeset 6672
- Timestamp:
- 09/03/05 20:41:00 (3 years ago)
- Location:
- src/Pugs
- Files:
-
- 3 modified
-
AST/Internals.hs (modified) (1 diff)
-
Eval/Var.hs (modified) (2 diffs)
-
Monads.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST/Internals.hs
r6590 r6672 4 4 module Pugs.AST.Internals ( 5 5 Eval, -- uses Val, Env, SIO 6 EvalMonad, 6 7 Exp(..), -- uses Pad, Eval, Val 7 8 Env(..), -- uses Pad, TVar, Exp, Eval, Val -
src/Pugs/Eval/Var.hs
r5807 r6672 19 19 import Pugs.Pretty 20 20 import Pugs.Config 21 import Pugs.Monads 21 22 22 23 findVar :: Var -> Eval (Maybe VRef) … … 352 353 constSym = return . Just . castV 353 354 354 findSyms :: Var -> Eval [( String, Val)]355 findSyms :: Var -> Eval [(Var, Val)] 355 356 findSyms name = do 356 lex <- asks envLexical 357 glob <- askGlobal 358 pkg <- asks envPackage 359 let names = nub [name, toPackage pkg name, toGlobal name] 360 syms <- forM [lex, glob] $ \pad -> do 361 forM names $ \name' -> do 362 case lookupPad name' pad of 363 Just tvar -> do 364 refs <- liftSTM $ mapM readTVar tvar 357 runMaybeT (findLexical `mplus` findPackage `mplus` findGlobal) >>= \ret -> 358 case ret of 359 Nothing -> return [] 360 Just xs -> return xs 361 where 362 findLexical :: MaybeT EvalMonad [(Var, Val)] 363 findLexical = do 364 lex <- lift $ asks envLexical 365 padSym lex name 366 367 findPackage :: MaybeT EvalMonad [(Var, Val)] 368 findPackage = do 369 glob <- lift $ askGlobal 370 pkg <- lift $ asks envPackage 371 padSym glob name `mplus` padSym glob (toPackage pkg name) 372 373 findGlobal :: MaybeT EvalMonad [(Var, Val)] 374 findGlobal = do 375 glob <- lift $ askGlobal 376 padSym glob (toGlobal name) 377 378 padSym :: Pad -> Var -> MaybeT EvalMonad [(Var, Val)] 379 padSym pad var = do 380 case lookupPad var pad of 381 Just tvar -> lift $ do 382 refs <- liftSTM $ mapM readTVar tvar 365 383 forM refs $ \ref -> do 366 384 val <- readRef ref 367 return ( name', val)368 Nothing -> return []369 return $ concat (concat syms)385 return (var, val) 386 Nothing -> mzero 387 370 388 371 389 toGlobal :: String -> String -
src/Pugs/Monads.hs
r5890 r6672 18 18 enterBlock, enterSub, 19 19 evalVal, tempVar, 20 21 MaybeT, runMaybeT, 20 22 21 23 module Control.Monad.RWS … … 26 28 import Pugs.Types 27 29 import Control.Monad.RWS 30 31 32 newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) } 33 34 instance (Monad m) => Monad (MaybeT m) where 35 (MaybeT mon) >>= f = 36 MaybeT (mon >>= maybe (return Nothing) (runMaybeT . f)) 37 return = MaybeT . return . Just 38 39 instance MonadTrans MaybeT where 40 lift mon = MaybeT (mon >>= return . Just) 41 42 instance (Monad m) => MonadPlus (MaybeT m) where 43 mzero = MaybeT (return Nothing) 44 mplus (MaybeT a) (MaybeT b) = MaybeT $ do 45 ma <- a 46 mb <- b 47 return $ ma `mplus` mb 48 28 49 29 50 {-|
