Changeset 10282 for src/Pugs/Eval

Show
Ignore:
Timestamp:
05/11/06 12:27:12 (3 years ago)
Author:
audreyt
svk:copy_cache_prev:
13387
Message:

* Support for $ENV::x and $+x.
* Unspecced: Does this *set* the ENV?

$+PATH = 'foo';

* Unspecced: What does this mean?

@+PATH = <foo bar>;

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Eval/Var.hs

    r10246 r10282  
    3333findVarRef name 
    3434    | Just (package, name') <- breakOnGlue "::" name 
    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')) 
    5070    | (_:'?':_) <- name = do 
    5171        rv  <- getMagical name