Changeset 6672

Show
Ignore:
Timestamp:
09/03/05 20:41:00 (3 years ago)
Author:
luqui
Message:

r548@feather: fibonaci | 2005-09-03 20:40:28 +0200
Rewrote findSyms to do real shadowing instead of returning all possible symbols. That is, if
there is a matching name in the lexical, it returns no global names. This solves the lexical
operator bug.

Location:
src/Pugs
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST/Internals.hs

    r6590 r6672  
    44module Pugs.AST.Internals ( 
    55    Eval,      -- uses Val, Env, SIO 
     6    EvalMonad, 
    67    Exp(..),   -- uses Pad, Eval, Val 
    78    Env(..),   -- uses Pad, TVar, Exp, Eval, Val 
  • src/Pugs/Eval/Var.hs

    r5807 r6672  
    1919import Pugs.Pretty 
    2020import Pugs.Config 
     21import Pugs.Monads 
    2122 
    2223findVar :: Var -> Eval (Maybe VRef) 
     
    352353constSym = return . Just . castV 
    353354 
    354 findSyms :: Var -> Eval [(String, Val)] 
     355findSyms :: Var -> Eval [(Var, Val)] 
    355356findSyms 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 
    365383                    forM refs $ \ref -> do 
    366384                        val <- readRef ref 
    367                         return (name', val) 
    368                 Nothing -> return [] 
    369     return $ concat (concat syms) 
     385                        return (var, val) 
     386                Nothing -> mzero 
     387         
    370388 
    371389toGlobal :: String -> String 
  • src/Pugs/Monads.hs

    r5890 r6672  
    1818    enterBlock, enterSub, 
    1919    evalVal, tempVar, 
     20     
     21    MaybeT, runMaybeT, 
    2022 
    2123    module Control.Monad.RWS 
     
    2628import Pugs.Types 
    2729import Control.Monad.RWS 
     30 
     31 
     32newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) } 
     33 
     34instance (Monad m) => Monad (MaybeT m) where 
     35    (MaybeT mon) >>= f = 
     36        MaybeT (mon >>= maybe (return Nothing) (runMaybeT . f)) 
     37    return              = MaybeT . return . Just 
     38 
     39instance MonadTrans MaybeT where 
     40    lift mon = MaybeT (mon >>= return . Just) 
     41 
     42instance (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 
    2849 
    2950{-|