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