Changeset 5170

Show
Ignore:
Timestamp:
07/04/05 00:37:10 (3 years ago)
Author:
autrijus
svk:copy_cache_prev:
6965
Message:

* eval now pushes one caller frame, just as Perl5's eval does.

Location:
src/Pugs
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Monads.hs

    r3904 r5170  
    4848enterEvalContext :: Cxt -> Exp -> Eval Val 
    4949enterEvalContext cxt = enterContext cxt . evalExp 
     50 
     51{-| 
     52Perform the specified evaluation in the specified package. 
     53 
     54(Subsequent chained 'Eval's do /not/ see this package.) 
     55-} 
     56enterPackage :: String -> Eval a -> Eval a 
     57enterPackage pkg = local (\e -> e{ envPackage = pkg }) 
     58 
     59{-| 
     60Enter a new environment and mark the previous one as 'Caller'. 
     61-} 
     62enterCaller :: Eval a -> Eval a 
     63enterCaller = local (\env -> env 
     64    { envCaller = Just env 
     65    , envDepth = envDepth env + 1 }) 
    5066 
    5167{-| 
     
    240256        } ] 
    241257 
    242 -- | (This doesn't seem to be used at the moment...) 
    243 caller :: Int -> Eval Env 
    244 caller n = do 
    245     depth <- asks envDepth 
    246     when (depth <= n) $ 
    247         fail "Cannot ask for deeper depth" 
    248     asks $ foldl (.) id $ replicate n (fromJust . envCaller) 
    249  
    250258evalVal :: Val -> Eval Val 
    251259evalVal val = do 
  • src/Pugs/Prim/Eval.hs

    r4919 r5170  
    1111import Pugs.Parser.Program 
    1212import Pugs.Embed 
     13import Pugs.Monads 
    1314import Pugs.Internals 
    1415import Pugs.Pretty 
     
    8586            EvalResultEnv -> (`mergeStmts` Syn "env" []) 
    8687            _             -> id 
    87     val <- resetT $ local (const env') $ do 
     88    val <- resetT $ local (const env') $ enterCaller $ do 
    8889        evl <- asks envEval 
    8990        evl (trans $ envBody env')