Re: do-while loops

2011-12-28 Thread Timon Gehr

On 12/28/2011 10:45 PM, Manfred Nowak wrote:

bearophile wrote:


void main() {
 do {
 int x = 5;
 } while (x != 5); // Error: undefined identifier x
}



Do you mean, that the similar while-loop should also be okay?

| void main() {
| while (x != 5) /* uses `x' out of _following_ scope */ {
| int x = 5;
| };
| }

-manfred


No, it is not any more valid than the following code, even if condition 
and body are scoped together:


void main() {
bool _ = x != 5;
int x = 5;
}

Related:

https://github.com/D-Programming-Language/dmd/pull/342#issuecomment-3232150


Re: do-while loops

2011-12-28 Thread Manfred Nowak
bearophile wrote:

> void main() {
> do {
> int x = 5;
> } while (x != 5); // Error: undefined identifier x
> }
> 

Do you mean, that the similar while-loop should also be okay?

| void main() {
| while (x != 5) /* uses `x' out of _following_ scope */ { 
| int x = 5;
| };
| }

-manfred


Re: do-while loops

2011-12-28 Thread Jonathan M Davis
On Wednesday, December 28, 2011 21:37:56 Timon Gehr wrote:
> Well, do loops are the least frequently used looping constructs. Also,
> if you actually have code like the following
> 
> import foo; // defines global symbol 'x'
> 
> void main(){
>  do {
>  int x;
>  // ...
>  }while(x<2);
> }
> 
> 
> It is likely that it is actually buggy because the programmer assumed
> lookup would work differently.

I don't know whether the change is worth making or not (it arguably does 
introduce an inconsistency into the scoping rules - though it _would_ 
definitely be useful), but I wouldn't really expect it to break any code. And 
I'd have to concurr that if it did, odds are that the code was buggy anyway.

- Jonathan M Davis


Re: do-while loops

2011-12-28 Thread Timon Gehr

On 12/28/2011 09:32 PM, Alex Rønne Petersen wrote:

On 28-12-2011 18:50, Timon Gehr wrote:

On 12/28/2011 06:42 PM, bearophile wrote:

Timon Gehr:


I fully agree, but why does this go to D.learn?


Because I think there's no hope to see this situation changed :-)

Bye,
bearophile


Why? The only D code that would get broken would be code that uses a
global variable in the loop condition of the same name as a do loop
local variable.


That's still a bit of a risk to take for such a small change, IMHO.

- Alex


Well, do loops are the least frequently used looping constructs. Also, 
if you actually have code like the following


import foo; // defines global symbol 'x'

void main(){
do {
int x;
// ...
}while(x<2);
}


It is likely that it is actually buggy because the programmer assumed 
lookup would work differently.


Re: do-while loops

2011-12-28 Thread Alex Rønne Petersen

On 28-12-2011 18:50, Timon Gehr wrote:

On 12/28/2011 06:42 PM, bearophile wrote:

Timon Gehr:


I fully agree, but why does this go to D.learn?


Because I think there's no hope to see this situation changed :-)

Bye,
bearophile


Why? The only D code that would get broken would be code that uses a
global variable in the loop condition of the same name as a do loop
local variable.


That's still a bit of a risk to take for such a small change, IMHO.

- Alex


Re: do-while loops

2011-12-28 Thread Denis Shelomovskij

28.12.2011 16:29, bearophile пишет:

One thing that I often find not handy in the design of do-while loops: the scope of their 
body ends before the "while":


void main() {
 do {
 int x = 5;
 } while (x != 5); // Error: undefined identifier x
}


So I can't define inside them variables that I test in the while().

This keeps the scope clean, but it's not nice looking:


void main() {
 {
 int x;
 do {
 x = 5;
 } while (x != 5);
 }
}

Bye,
bearophile


+1
I faced it a few days ago too. An enhancement request should be filled. 
Even if it will be resolved as WONTFIX, at least we will know a reason.


Re: do-while loops

2011-12-28 Thread Timon Gehr

On 12/28/2011 06:42 PM, bearophile wrote:

Timon Gehr:


I fully agree, but why does this go to D.learn?


Because I think there's no hope to see this situation changed :-)

Bye,
bearophile


Why? The only D code that would get broken would be code that uses a 
global variable in the loop condition of the same name as a do loop 
local variable.


Re: do-while loops

2011-12-28 Thread bearophile
Timon Gehr:

> I fully agree, but why does this go to D.learn?

Because I think there's no hope to see this situation changed :-)

Bye,
bearophile


Re: do-while loops

2011-12-28 Thread Xinok

On 12/28/2011 8:29 AM, bearophile wrote:

One thing that I often find not handy in the design of do-while loops: the scope of their 
body ends before the "while":


void main() {
 do {
 int x = 5;
 } while (x != 5); // Error: undefined identifier x
}



I would just rewrite it like so:

void main(){
while(true){
int x = 5;
if(x != 5) continue;
break;
}
}


Re: do-while loops

2011-12-28 Thread Timon Gehr

On 12/28/2011 04:01 PM, Andrej Mitrovic wrote:

A very small cheat:
void main()
{
 if (int x = 0)
 do {
 x = 5;
 } while (x != 5);
}

Only works for this simple case though. Put your post in d.general, I
totally agree with it as well.


This won't work. The 'if' condition is always false.


Re: do-while loops

2011-12-28 Thread Andrej Mitrovic
A very small cheat:
void main()
{
if (int x = 0)
do {
x = 5;
} while (x != 5);
}

Only works for this simple case though. Put your post in d.general, I
totally agree with it as well.


Re: do-while loops

2011-12-28 Thread Timon Gehr

On 12/28/2011 02:29 PM, bearophile wrote:

One thing that I often find not handy in the design of do-while loops: the scope of their 
body ends before the "while":


void main() {
 do {
 int x = 5;
 } while (x != 5); // Error: undefined identifier x
}


So I can't define inside them variables that I test in the while().

This keeps the scope clean, but it's not nice looking:


void main() {
 {
 int x;
 do {
 x = 5;
 } while (x != 5);
 }
}

Bye,
bearophile


I fully agree, but why does this go to D.learn?


do-while loops

2011-12-28 Thread bearophile
One thing that I often find not handy in the design of do-while loops: the 
scope of their body ends before the "while":


void main() {
do {
int x = 5;
} while (x != 5); // Error: undefined identifier x
}


So I can't define inside them variables that I test in the while().

This keeps the scope clean, but it's not nice looking:


void main() {
{
int x;
do {
x = 5;
} while (x != 5);
}
}

Bye,
bearophile