Allow variables declared in do-while loop body to be in scope in the condition?

Remi Forax forax at univ-mlv.fr
Mon Jan 15 17:33:51 UTC 2024


> From: "David Alayachew" <davidalayachew at gmail.com>
> To: "Tagir Valeev" <amaembo at gmail.com>, "amber-dev" <amber-dev at openjdk.org>
> Sent: Monday, January 15, 2024 10:59:17 AM
> Subject: Re: Allow variables declared in do-while loop body to be in scope in
> the condition?

> I forgot to click Reply All, so most of this conversation happened off of the
> mailing list. Read below to see the discussion, as well as an example of what
> Tagir was talking about, as well as potential workarounds.

> On Mon, Jan 15, 2024 at 4:48 AM Tagir Valeev < [ mailto:amaembo at gmail.com |
> amaembo at gmail.com ] > wrote:

>> Probably. By the way, the original piece of code I usually write as:
>> while(true) {
>> final var someVar = someMethod();
>> doSomethingWith(someVar);
>> //etc.
>> if (!someVar.someBooleanReturningMethod()) break;
>> }

>> Not so pretty too, but still allows keeping the scope of someVar limited and
>> avoiding splitting the declaration and the assignment.

>> With best regards,
>> Tagir Valeev.

yes, 
technically, you can do a little bit better (in terms of bytecode) to avoid two consecutive gotoes. 

while(true) { 
final var someVar = someMethod(); 
doSomethingWith(someVar); 
//etc. 
if (someVar.someBooleanReturningMethod()) continue; 
break; 
} 

regards, 
Rémi 

>> On Mon, Jan 15, 2024 at 10:20 AM David Alayachew < [
>> mailto:davidalayachew at gmail.com | davidalayachew at gmail.com ] > wrote:

>>> Ah, I see what you mean now.

>>> In that case, nevermind. I understand now why my idea is backwards incompatible.
>>> What a shame.

>>> Acknowledging that this idea no longer has ground to stand on, let me ask the
>>> hypothetical -- would do-while loops be better with this feature implemented? I
>>> am not at all trying to get this feature implemented anymore. I just want to
>>> know if it would have been a good idea in the first place, backwards
>>> compatibility issues aside.

>>> On Mon, Jan 15, 2024 at 4:04 AM Tagir Valeev < [ mailto:amaembo at gmail.com |
>>> amaembo at gmail.com ] > wrote:

>>>> E.g.:
>>>> public class DoWhile {
>>>> static boolean b = false ;

>>>> public static void main ( String [] args ) {
>>>> do {
>>>> boolean b = true ;
>>>> } while ( b );
>>>> }
>>>> }

>>>> Now, this code is correct and finishes successfully. If we expand the scope of
>>>> local b to the condition, it will shadow the field b. As a result, the code
>>>> will still be correct but stuck in endless loop.

>>>> With best regards,
>>>> Tagir Valeev.

>>>> On Mon, Jan 15, 2024 at 9:00 AM David Alayachew < [
>>>> mailto:davidalayachew at gmail.com | davidalayachew at gmail.com ] > wrote:

>>>>> Hello,

>>>>> Thank you for your response!

>>>>> I am afraid I do not follow. Could you post an example?

>>>>> From my quick experimentation now, it seems like what you describe isn't
>>>>> possible.

>>>>> The only way I could see what you are saying to be true is if a variable is in
>>>>> scope for the while condition, but not in scope for the do-while body. And I
>>>>> can't seem to create a situation where a variable is in scope for the while
>>>>> condition, but is not in scope for the body.

>>>>> Or maybe it is something else entirely? Please lmk.

>>>>> Thank you for your time and help!
>>>>> David Alayachew

>>>>> On Mon, Jan 15, 2024 at 2:51 AM Tagir Valeev < [ mailto:amaembo at gmail.com |
>>>>> amaembo at gmail.com ] > wrote:

>>>>>> Note that this is not the compatible change, as the variable may shadow
>>>>>> same-named field which was in the scope of condition before.

>>>>>> On Mon, Jan 15, 2024, 08:49 David Alayachew < [ mailto:davidalayachew at gmail.com
>>>>>> | davidalayachew at gmail.com ] > wrote:

>>>>>>> Hello Amber Dev Team,

>>>>>>> Would it make sense and would there be value in allowing variables declared in
>>>>>>> the body of a do-while loop to still be considered in scope for the condition
>>>>>>> of the same do-while loop?

>>>>>>> Basically, the following example is currently not valid Java, but should it be?

>>>>>>> ```java

>>>>>>> do
>>>>>>> {

>>>>>>> final var someVar = someMethod();

>>>>>>> doSomethingWith(someVar);

>>>>>>> //etc.

>>>>>>> }

>>>>>>> while (someVar.someBooleanReturningMethod());

>>>>>>> ```

>>>>>>> I think this is clear, simple, and is better than the alternative.

>>>>>>> ```java

>>>>>>> /* Must be mutable! :( */
>>>>>>> /* And you probably need a default value too! */
>>>>>>> var someVar = someYuckyDefaultOrWorseYetNull;

>>>>>>> do
>>>>>>> {

>>>>>>> //code

>>>>>>> }

>>>>>>> while (someVar != 42);

>>>>>>> //And annoyingly enough, the variable is still in scope outside of the loop!
>>>>>>> Blegh.

>>>>>>> ```

>>>>>>> Since do-while loops are very old, I wouldn't be surprised if someone else has
>>>>>>> asked this before. But regardless, I couldn't find anything, so I ask now -- is
>>>>>>> there any value in doing this?

>>>>>>> Thank you for your time and help!
>>>>>>> David Alayachew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20240115/e870ca8a/attachment-0001.htm>


More information about the amber-dev mailing list