Changeset 15581
- Timestamp:
- 03/11/07 03:18:14 (21 months ago)
- Files:
-
- 1 modified
-
src/Pugs/Monads.hs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Monads.hs
r15456 r15581 260 260 assertBlocks f name = forM_ (f sub) $ \cv -> do 261 261 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) 263 263 typ = subType sub 264 264 doCC :: (Val -> Eval b) -> [Val] -> Eval b 265 doCC cc [] = cc undef 265 266 doCC cc [v] = cc =<< evalVal v 266 doCC _ _ = internalError "enterSub: doCC list length /=1"267 doCC _ _ = internalError "enterSub: doCC list length > 1" 267 268 orig :: VCode -> VCode 268 269 orig sub = sub { subBindings = [], subParams = (map fst (subBindings sub)) } … … 280 281 } 281 282 | 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) 287 285 return $ \e -> e 288 { envLexical = combine ( concat[subRec, callerRec]) (subPad sub)286 { envLexical = combine ([subRec, callerRec]) (subPad sub) 289 287 , envPackage = maybe (envPackage e) envPackage (subEnv sub) 290 288 , envOuter = maybe Nothing envOuter (subEnv sub) … … 299 297 } 300 298 301 genSubs :: t -> String -> (t -> VCode) -> Eval [PadMutator]302 genSubs env name gen = sequence303 [ genMultiSym (cast name) (codeRef $ gen env)304 , genMultiSym (cast name) (codeRef $ (gen env) { subParams = [] })305 ]306 307 299 makeParams :: Env -> [Param] 308 300 makeParams MkEnv{ envContext = cxt, envLValue = lv } 309 301 = [ MkOldParam 310 302 { isInvocant = False 311 , isOptional = False303 , isOptional = True 312 304 , isNamed = False 313 305 , isLValue = lv
