Changeset 4878

Show
Ignore:
Timestamp:
06/20/05 20:42:00 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
6641
Message:

* blocks can now return values: my &x = { 3 }; say x()

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Compile/PIR.hs

    r4876 r4878  
    189189    compile exp = compileStmts exp 
    190190 
    191 class EnterClass m a | m -> a where 
     191class EnterClass m a where 
    192192    enter :: a -> m b -> m b 
     193 
     194instance EnterClass CompMonad VCode where 
     195    enter sub = local (\e -> e{ envLValue = subLValue sub, envContext = CxtItem (subReturns sub) }) 
    193196 
    194197instance EnterClass CompMonad Cxt where 
     
    227230            then case val of 
    228231                VBool True      -> compile Noop 
    229                 VInt x | x > 0  -> compile Noop 
    230232                _               -> do 
    231233                    warn "Useless use of a constant in void context" val 
     
    242244        return $ PStmt $ PExp $ PApp TCxtVoid funC [preC, PBlock condC, PBlock bodyC, PBlock postC] 
    243245    compile exp = fmap PStmt $ compile exp 
     246 
     247{- 
     248subTCxt :: VCode -> Eval TCxt 
     249subTCxt sub = return $ if subLValue sub 
     250    then TCxtLValue (subReturns sub) 
     251    else TCxtItem (subReturns sub) 
     252-} 
    244253 
    245254askTCxt :: Eval TCxt 
     
    344353    compile (Syn "sub" [Val (VCode sub)]) = do 
    345354        -- XXX I'd like to lambda lift... :-/ 
    346         _       <- askTCxt 
    347         bodyC   <- compile $ case subBody sub of 
     355        bodyC   <- enter sub $ compile $ case subBody sub of 
    348356            Syn "block" [exp]   -> exp 
    349357            exp                 -> exp 
     
    633641varInit ('@':_) = text $ "PerlArray" 
    634642varInit ('%':_) = text $ "PerlHash" 
     643varInit ('&':_) = text $ "PerlScalar" 
    635644varInit x       = error $ "invalid name: " ++ x 
    636645