| 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 |