| 35 | | , Just (sig, "") <- breakOnGlue "CALLER" package = do |
| 36 | | maybeCaller <- asks envCaller |
| 37 | | case maybeCaller of |
| 38 | | Just env -> local (const env) $ do |
| 39 | | rv <- findVarRef (sig ++ name') |
| 40 | | return rv |
| 41 | | Nothing -> retError "cannot access CALLER:: in top level" name |
| 42 | | | Just (package, name') <- breakOnGlue "::" name |
| 43 | | , Just (sig, "") <- breakOnGlue "OUTER" package = do |
| 44 | | maybeOuter <- asks envOuter |
| 45 | | case maybeOuter of |
| 46 | | Just env -> local (const env) $ do |
| 47 | | findVarRef (sig ++ name') |
| 48 | | Nothing -> retError "cannot access OUTER:: in top level" name |
| 49 | | | (sig:'+':name') <- name = findVarRef (sig:("CALLER::"++name')) |
| | 35 | = case () of |
| | 36 | _ | Just (sig, "") <- breakOnGlue "CALLER" package -> do |
| | 37 | maybeCaller <- asks envCaller |
| | 38 | case maybeCaller of |
| | 39 | Just env -> local (const env) $ do |
| | 40 | rv <- findVarRef (sig ++ name') |
| | 41 | return rv |
| | 42 | Nothing -> retError "cannot access CALLER:: in top level" name |
| | 43 | _ | Just (sig, "") <- breakOnGlue "ENV" package -> fix $ \upLevel -> do |
| | 44 | maybeCaller <- asks envCaller |
| | 45 | case maybeCaller of |
| | 46 | Just env -> local (const env) $ do |
| | 47 | rv <- findVarRef (sig ++ name') |
| | 48 | if isJust rv then return rv else upLevel |
| | 49 | Nothing -> do |
| | 50 | -- final callback: try an "environment" lookup |
| | 51 | -- XXX: how does "@+PATH" differ from "$+PATH"? |
| | 52 | -- XXX: how to tell empty env from nonexistent env? |
| | 53 | -- should we allow writes? |
| | 54 | exists <- evalExp $ App (Var "&exists") (Just (Var "%*ENV")) [Val (VStr name')] |
| | 55 | case exists of |
| | 56 | VBool False -> do |
| | 57 | retError "no such ENV:: variable" name' |
| | 58 | _ -> do |
| | 59 | rv <- enterLValue (evalExp $ Syn "{}" [Var "%*ENV", Val (VStr name')]) |
| | 60 | tvar <- liftSTM . newTVar =<< fromVal rv |
| | 61 | return (Just tvar) |
| | 62 | _ | Just (sig, "") <- breakOnGlue "OUTER" package -> do |
| | 63 | maybeOuter <- asks envOuter |
| | 64 | case maybeOuter of |
| | 65 | Just env -> local (const env) $ do |
| | 66 | findVarRef (sig ++ name') |
| | 67 | Nothing -> retError "cannot access OUTER:: in top level" name |
| | 68 | _ -> doFindVarRef name |
| | 69 | | (sig:'+':name') <- name = findVarRef (sig:("ENV::"++name')) |