On Tue, Sep 20, 2005 at 08:58:41PM +0200, Juerd wrote: > Yuval Kogman skribis 2005-09-20 20:33 (+0300): > > Today on #perl6 I complained about the fact that this is always > > inelegant: > > if ($condition) { pre } > > unconditional midsection; > > if ($condition) { post } > > I believe it's not inelegant enough to do something about. > > The unconditional part is easily copied if it's a single line, and can > easily be factored to a method or sub if it's not. Especially with > lexical subs.
There's a middle range where midsection is complicated enough that copying it is a bad idea, but it is still sufficiently short that factoring it into a sub causes more clutter and interrupted thought patterns. I've half-heartedly wished for this sort of linguistic construct many times over the years, but it comes up rarely enough that it's never been a burning desire. Furthermore, any language construct I've considered seems worse to me than just using statement modifiers. (So, this desire became far less of a burning issue when I began programming in perl instead of C and other languages.) I don't like copying code of even a small amount of complexity - sooner or later a change will happen to one copy that doesn't get made to the other copy of the code, and a bug has been inserted. So, I just assign the condition to a variable and use: { my $cond = ... condition ...; pre if $cond; ... mid ... post if $cond; } When I read this sort of code to check it for problems, I want clarity. I'm going to have to read it twice to ensure that it is correct for both of the ways it will be used (when $cond is true and when it is false). Moving mid into a subroutine makes that reading harder. Even the syntax that Yuval suggests is more cluttered for reading the "straight-line" code for the $cond is true case. Reading the code for the case when $cond is false is easy no matter which coding method you use - all of the midsection code is in one place with any technique. But when reading the code for the case when $cond is true, I can read the code as if it were: pre ... mid ... post by simply ignoring the trailing " if $cond;" as I read. Ignoring the text off to the right is easy; much easier than ignoring syntax that is mixed into the code, or than reading code that has been broken into 3 parts and the middle part is somewhere on the page before or after the other two parts. --