Ben Morrow wrote: > I'm iworking on a patch for Perl 5 that implements the Perl 6 closure > traits (ENTER/LEAVE/...) as special blocks. There are several details > that aren't clear to me from either S04 or the spec tests; I apologize > if these have been discussed before, as I haven't been following p6l.
No need to apologize; such things should be clear from reading the spec. Note that my answers are in no way authoritative, just proposals on how to handle it (and maybe starting point of useful discussions). > I'm also not subscribed, so if people could keep me in the CC that would > be appreciated. > > - Presumably when an exception is thrown through a block, the LEAVE and > POST queues are called (in that order). POST was inspired from the Design By Contract department, and are meant to execute assertions on the result. If you leave a block through an exception you don't have a result, so I don't think running a POST block makes sense. I'm not sure about running LEAVE blocks either, because that's what CATCH blocks are for. > What if a PRE block fails: is > the POST queue on the same block called? (Do you have to satisfy your > post-conditions even if your pre-conditions failed?) I'd say that if a PRE block fails, nothing else is run (neither LEAVE nor POST nor ...) > - If a POST block is called as a result of a thrown exception, and it > fails, which exception 'wins'? Question obsoleted by previous answer ;-) > - Presumably if an ENTER block dies, the rest of that ENTER queue is > abandoned. Does that also apply to the LEAVE queue? What should > > { > LEAVE { say "leave1" } > LEAVE { say "leave2"; die "foo"; } > } > > print? Similarly POST: once one post-condition has failed, are > subsequent post-conditions checked? > - Can a try block catch an exception thrown from its own ENTER or LEAVE > queue? Yes. > For example in this case: > > try { > > try { > ENTER { die "foo" } > CATCH { default { say "caught inside" } } > } > > CATCH { default { say "caught outside" } } > } > > which CATCH block gets the exception? What about PRE/POST: can you > CATCH failure of your own pre-/post-conditions? > > - Does it make any difference in any of the above if 'die' is replaced > by 'exit'? No idea, really. HTH, Moritz