if(;){} opinion
David Medlock
noone at nowhere.com
Mon Feb 27 05:21:54 PST 2006
Georg Wrede wrote:
> Better 'fess up front: the intent of this post is to once and for all
> murder, pulverize and extradite the new if construct.
>
> Consider:
>
> if (m; std.regexp.search("abcdef", "b(c)d"))
> {
> writefln("[%s]", m.pre); // prints [a]
> writefln("[%s]", m.post); // prints [ef]
> writefln("[%s]", m.match(0)); // prints [bcd]
> writefln("[%s]", m.match(1)); // prints [c]
> writefln("[%s]", m.match(2)); // prints []
> }
>
> Flauting this around has shown that experienced programmers have a hard
> time figuring out what is going on here.
>
> Consider:
>
> if (m; std.regexp.search("abcdef", "b(c)d"))
>
> Most everybody take it for granted that here is a typo, the '(m;' must
> be the result of a sloppy copy-paste.
>
> And in the previous case the theories ranged from all kinds of
> behind-the-scenes magic.
>
> Now consider:
>
> if (Regexp m = std.regexp.search("abcdef", "b(c)d"))
> {
> writefln("[%s]", m.pre); // prints [a]
> writefln("[%s]", m.post); // prints [ef]
> writefln("[%s]", m.match(0)); // prints [bcd]
> writefln("[%s]", m.match(1)); // prints [c]
> writefln("[%s]", m.match(2)); // prints []
> }
>
> Flaunting this around (to both the original programmers, and also to
> virgin victims), gave the same, _immediate_ comment from everybody: "Ah,
> that's neat!"
I would say extend the with(...) construct to silently fail( and take an
else clause ) if the object of the with statement is null.
with( Regexp m = std.regexp.search(...) )
{
...
}
else { ... }
Of course foreach is still preferred for multi returned values.
-DavidM
More information about the Digitalmars-d
mailing list