Ideas regarding flow control and loops
BCS
ao at pathlink.com
Sun Nov 4 16:32:45 PST 2007
Reply to Bruce,
> BCS Wrote:
>
>> I'd rather an extension of the scope syntax
>>
>> while(cond)
>> {
>> scope(last) DoOnCondFailed();
>> scope(break) DoOnBreak(); // or any explicet quit
>> scope(skip) DoIfCondNeverPasses();
>> scope(first) goto SkipSomeStuff;
>> ...
>> }
> Lets take these one at a time:-
>
> scope(last): - totally useless assuming I understood the meaning
>
> while(cond) {
> }
> DoOnCondFailed();
for(int i = 5; i>0 i--)
{
scope(last) ThisNeverRuns();
break;
}
> scope(skip): - saves you one conditional - not very useful
>
> if (!cond)
> DoIfCondNeverPasses();
> else do
> {
> ...
> }
> while(cond);
>
mine looks better (IMHO)
> scope(break): - saves you a function call or two.
>
> while(cond)
> {
> ...
> if (cond2) DoOnBreak(); break;
> ...
> if (cond3) DoOnBreak(); break;
> ...
> }
you prove half of my point and don't address the other half
while(cond)
{
...
if (cond2)
DoOnBreak();
break;
... // this never runs
if (cond3)
DoOnBreak();
break;
...
}
If you didn't get it correct in this case, what are the chances of making
an error in a more complicated case
The other part is that it is very easy to forget to add the DoOnBreak to
one of the breaks (you try finding them all in old code) or adding it to
every new one (Now what needs to be done on break this time).
Also, it will work with mixin(string) when you can't get to the string.
> scope(first):
>
> if (cond)
> {
> DoFirstTimeOnly();
> }
> while(cond)
> {
> ...
> }
> goto is evil so you want the opposite too
>
> scope(notonfirst):
>
good idea.
> while(cond)
> {
> static bool firstTime = false;
> if (firstTime==false) { firstTime = true; body1(); }
> body2();
> }
> For this case there is slight justification for something. but that
> something is a notfirst() functor.
>
> class notfirst
> {
> private:
> bool first;
> delegate doOnFirst;
> delegate doOnSubsequent;
> public:
> notfirst(delegate doOnFirst_,
> delegate doOnSubsequent_):
> first(true)
> doOnFirst(doOnFirst_),
> doOnSubsequent(doOnSubsequent_)
> {}
> void run() {
> if (first)
> {
> doOnFirst();
> first = false;
> }
> else doOnSubsequent();
> }
> };
> while(cond)
> {
> doOnFirst(body1(); body2());
> }
My eyes!!! I can't think of anything good to say about that solution.
> What is this equivalent to in the worst case scenario that you need
> all four?
>
> if (!cond)
> DoIfCondNeverPasses();
> else
> {
> DoFirstTimeOnly();
> do
> {
> doOnFirst(body1();
> {
> ...
> if (cond2) DoOnBreak(); break;
> ...
> if (cond3) DoOnBreak(); break;
> ...
> }
> }
> while(cond);
> }
> DoOnCondFailed();
>
> On balance this doesn't seem like a necessary or really useful syntax
> improvement to me.
>
the same can be said for scope(failure/success/exit). It's all sugar. I think
the scope(*) solution looks better and is easier to read an maintain in _all_
the cases you list.
In all these cases the compiler can trivially implement them with copy/paste
and by rearranging jumps.
> Regards,
>
> Bruce.
> to me.
More information about the Digitalmars-d
mailing list