Changeset 15581

Show
Ignore:
Timestamp:
03/11/07 03:18:14 (21 months ago)
Author:
audreyt
Message:

* Pugs.Monads: &?CALLER_CONTINUATION is now a simple constant

sub with a simple signature that matches "want", instead of
a multi; when we convert &want into MO, it can just box the
continuation's signature object and save all the guesswork.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Monads.hs

    r15456 r15581  
    260260    assertBlocks f name = forM_ (f sub) $ \cv -> do 
    261261        rv <- fromVal =<< (evalExp . Syn "block" . (:[]) . Syn "sub" . (:[]) . Val . castV $ cv) 
    262         if rv then return () else retError (name ++ " assertion failed") (subName sub) 
     262        if rv then return () else die (name ++ " assertion failed") (subName sub) 
    263263    typ = subType sub 
    264264    doCC :: (Val -> Eval b) -> [Val] -> Eval b 
     265    doCC cc []  = cc undef 
    265266    doCC cc [v] = cc =<< evalVal v 
    266     doCC _  _   = internalError "enterSub: doCC list length /= 1" 
     267    doCC _  _   = internalError "enterSub: doCC list length > 1" 
    267268    orig :: VCode -> VCode 
    268269    orig sub = sub { subBindings = [], subParams = (map fst (subBindings sub)) } 
     
    280281                } 
    281282        | otherwise = do 
    282             subRec <- sequence 
    283                 [ genSym (cast "&?ROUTINE") (codeRef (orig sub)) 
    284                 ] 
    285             -- retRec    <- genSubs env "&return" retSub 
    286             callerRec <- genSubs env "&?CALLER_CONTINUATION" (ccSub cc) 
     283            subRec    <- genSym (cast "&?ROUTINE") (codeRef (orig sub)) 
     284            callerRec <- genSym (cast "&?CALLER_CONTINUATION") (codeRef $ ccSub cc env) 
    287285            return $ \e -> e 
    288                 { envLexical = combine (concat [subRec, callerRec]) (subPad sub) 
     286                { envLexical = combine ([subRec, callerRec]) (subPad sub) 
    289287                , envPackage = maybe (envPackage e) envPackage (subEnv sub) 
    290288                , envOuter   = maybe Nothing envOuter (subEnv sub) 
     
    299297        } 
    300298 
    301 genSubs :: t -> String -> (t -> VCode) -> Eval [PadMutator] 
    302 genSubs env name gen = sequence 
    303     [ genMultiSym (cast name) (codeRef $ gen env) 
    304     , genMultiSym (cast name) (codeRef $ (gen env) { subParams = [] }) 
    305     ] 
    306  
    307299makeParams :: Env -> [Param] 
    308300makeParams MkEnv{ envContext = cxt, envLValue = lv } 
    309301    = [ MkOldParam 
    310302        { isInvocant = False 
    311         , isOptional = False 
     303        , isOptional = True 
    312304        , isNamed    = False 
    313305        , isLValue   = lv