Changeset 8705 for src/Pugs/Monads.hs

Show
Ignore:
Timestamp:
01/16/06 18:57:28 (3 years ago)
Author:
audreyt
Message:

* Support for $+var as shorthand for $CALLER::var.
* CALLER now only sees lexical variables in the outer dynamic

scope declared with the "env" scope specifier.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Monads.hs

    r8699 r8705  
    1616    enterLex, enterContext, enterEvalContext, enterPackage, enterCaller, 
    1717    enterGiven, enterWhen, enterWhile, genSymPrim, genSymCC, 
    18     enterBlock, enterSub, 
     18    enterBlock, enterSub, envEnterCaller, 
    1919    evalVal, tempVar, 
    2020     
     
    2727import Pugs.Types 
    2828import Control.Monad.RWS 
     29import qualified Data.Map as Map 
    2930 
    3031 
     
    8990-} 
    9091enterCaller :: Eval a -> Eval a 
    91 enterCaller = local (\env -> env 
     92enterCaller = local envEnterCaller 
     93 
     94envEnterCaller :: Env -> Env 
     95envEnterCaller env = env 
    9296    { envCaller = Just env 
    93     , envDepth = envDepth env + 1 }) 
     97        { envLexical = MkPad (lex `Map.intersection` envImplicit env) 
     98        } 
     99    , envDepth = envDepth env + 1 
     100    , envImplicit = Map.fromList [("$_", ())] 
     101    } 
     102    where 
     103    MkPad lex = envLexical env 
    94104 
    95105{-| 
     
    244254                , envPackage = maybe (envPackage e) envPackage (subEnv sub) 
    245255                , envLexical = combine [blockRec] 
    246                     (subPad sub `unionPads` envLexical env) } 
     256                    (subPad sub `unionPads` envLexical env) 
     257                , envImplicit= envImplicit e `Map.union` Map.fromList 
     258                    [ ("&?BLOCK", ()) ] 
     259                } 
    247260        | otherwise = do 
    248261            subRec <- sequence 
     
    255268                , envPackage = maybe (envPackage e) envPackage (subEnv sub) 
    256269                , envOuter   = maybe Nothing envOuter (subEnv sub) 
     270                , envImplicit= envImplicit e `Map.union` Map.fromList 
     271                    [ ("&?SUB", ()), ("$?SUBNAME", ()), ("&?CALLER_CONTINUATION", ()) ] 
    257272                } 
    258273    ccSub :: (Val -> Eval Val) -> Env -> VCode