Changeset 6672 for src/Pugs/Eval/Var.hs

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.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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