<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<p>Actually, regarding the `else` block/branch for a loop, there's
almost a precedence for this in Python: for and while loops can
have an `else` block that executes after the loop has finished,
iff no break statement (or, of course, return) was hit inside of
the loop, only that this doesn't elevate the loop to an
expression. Using the same logic for yielding from an expression
loop could work equally - the downside is that even in Python it's
considered quite uncommon/unusual syntax.<br/>
</p>
Regards,<br/>
<p> Adowrath</p>
<p>(Sorry for the repeat mail to you RedIODev; forgot to put the +ml
into my sender address so it didn't get through to the mailing
list)<br/>
</p>
<p></p>
<div class="moz-cite-prefix">Am 2023-04-05 um 19:17 schrieb Red IO:<br/>
</div>
<blockquote type="cite" cite="mid:CABKyW1vrNQ92Sk6OQz85sO4Mi5jv1ZzcvSDUZY3X3qx=5X+dLw@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<div dir="auto">I actually tried this exactly with annotation
processor "hacks" I then realized that a loop might execute 0
times or never conditionally hit a yield statements. This
results in the expression sometimes not yielding a result which
wouldn't allow an assignment to a final variable and confusing
errors like "variable might not be initialized" the only
solution would be to add an else block to a loop that os
executed when no yield was hit in the loop body (which would be
ugly and confusing in my opinion)
<div dir="auto">That's why I stepped down from generalizing
yield to all control flow elements to specially allow yield in
try. </div>
<div dir="auto"><br/>
</div>
<div dir="auto">Great regards </div>
<div dir="auto">RedIODev </div>
</div>
<br/>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Apr 5, 2023, 16:27
Holo The Sage Wolf <<a href="mailto:holo3146@gmail.com" moz-do-not-send="true" class="moz-txt-link-freetext">holo3146@gmail.com</a>>
wrote:<br/>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="auto">A different approach is to give `yield` the
same semantics as `break`, and interpreting `break label` as
`yield label null`, this would make all label blocks be
expressions.
<div dir="auto"><br/>
</div>
<div dir="auto">The only thing we need to be careful with is
finally block, but this situation already happens with
`return` inside of a finally block, so I don't think we
need to handle this situation differently </div>
</div>
<br/>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Apr 5, 2023, 15:55
Tagir Valeev <<a href="mailto:amaembo@gmail.com" rel="noreferrer noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">amaembo@gmail.com</a>>
wrote:<br/>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Hello!
<div><br/>
</div>
<div>Just for the record, three years ago I posted a
similar, though more universal proposal, "do
expressions":</div>
<div><a href="https://mail.openjdk.org/pipermail/amber-spec-experts/2020-March/002046.html" rel="noreferrer noreferrer noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://mail.openjdk.org/pipermail/amber-spec-experts/2020-March/002046.html</a><br/>
</div>
<div><br/>
</div>
<div>With best regards,</div>
<div>Tagir Valeev.</div>
</div>
<br/>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Apr 5, 2023 at
11:58 AM Red IO <<a href="mailto:redio.development@gmail.com" rel="noreferrer noreferrer noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">redio.development@gmail.com</a>>
wrote:<br/>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px
0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div dir="auto">I did some more research and testing
and concluded that loop expressions are more
difficult to achieve than I thought and are not as
simple as I thought.
<div dir="auto">So I limit my proposal to try
expressions since I really think they are worth
it. </div>
<div dir="auto">A try expression would follow this
syntax:</div>
<div dir="auto">TARGET VARIABLE = TRY_KEYWORD
[RECOURSE_BLOCK] TRY_BODY(with every path leading
to a yield or throw) [CATCH_BLOCKS(with also a
yield or throw in every path)] </div>
<div dir="auto">[FINALLY_BLOCK (with no yield but
throw possible)];</div>
<div dir="auto"><br/>
</div>
<div dir="auto">An example would be:</div>
<div dir="auto">int fileInt = try (var reader = new
BufferedReader(new FileReader("test.txt"))) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>var
line = reader.readLine();</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>if
(line == null) </div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
-1;</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
Integer.parseInt(line);</div>
<div dir="auto">} catch (IOException e) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>throw
new CustomException("Couldn't open file", e);</div>
<div dir="auto">} catch (NumberFormatException e) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
-1;</div>
<div dir="auto">} finally {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>if
(outsideCondition) </div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>throw
new CustomCancelledExecption();</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>System.out.println("file
read done");</div>
<div dir="auto">};</div>
<div dir="auto"><br/>
</div>
<div dir="auto">This example is constructed to
feature all possible parts of the syntax and is
not necessarily code that makes sense to write. </div>
<div dir="auto"><br/>
</div>
<div dir="auto">Great regards </div>
<div dir="auto">RedIODev </div>
</div>
<br/>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Sat, Mar 4,
2023, 10:55 Red IO <<a href="mailto:redio.development@gmail.com" rel="noreferrer noreferrer noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">redio.development@gmail.com</a>>
wrote:<br/>
</div>
<blockquote class="gmail_quote" style="margin:0px
0px 0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div dir="auto">Currently we have the switch
expression as the only expression returning a
result.
<div dir="auto">Example:</div>
<div dir="auto">boolean b = switch (1) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>case
0 -> false;</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>case
1 -> {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
true;</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>} </div>
<div dir="auto">};</div>
<div dir="auto"><br/>
</div>
<div dir="auto">The idea would be to expand this
syntax to different expressions for example
the try expression:</div>
<div dir="auto"><br/>
</div>
<div dir="auto">int i = try {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
Integer.parseInt("Abc");</div>
<div dir="auto">} catch (NumberFormatException
e) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
-1;</div>
<div dir="auto">};</div>
<div dir="auto"><br/>
</div>
<div dir="auto">Or loops:</div>
<div dir="auto"><br/>
</div>
<div dir="auto">String searched = for(String s :
args) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>if
(s.startsWith("-"))</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
s;</div>
<div dir="auto">};</div>
<div dir="auto"><br/>
</div>
<div dir="auto">The idea is to make all java
control flow expressions able to yield a
value. </div>
<div dir="auto"><br/>
</div>
<div dir="auto">Among many new patterns possible
like the examples above it would for example
"clean up" the exception catching
initialization:</div>
<div dir="auto"><br/>
</div>
<div dir="auto">Foo foo = null;</div>
<div dir="auto"><br/>
</div>
<div dir="auto">try {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>foo
= new Foo();</div>
<div dir="auto">} catch (SomeException e) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>//do
something or nothing </div>
<div dir="auto">} finally {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>//maybe
change the value again</div>
<div dir="auto">} </div>
<div dir="auto"><br/>
</div>
<div dir="auto">To</div>
<div dir="auto"><br/>
</div>
<div dir="auto">var foo = try {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>yield
new Foo();</div>
<div dir="auto">} catch (SomeException e) {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>//throw
or yield</div>
<div dir="auto">} finally {</div>
<div dir="auto"><span style="white-space:pre-wrap"> </span>//throw
or do nothing </div>
<div dir="auto">};</div>
<div dir="auto"><br/>
</div>
<div dir="auto">Another benefit especially in
this example is the clearer state of the
result. In an yielding expression you have to
either yield or throw. Also subsequent
manipulation in for example the finally block
is not possible making the source of the
returned result clear to identify.</div>
<div dir="auto"><br/>
</div>
<div dir="auto">Great regards </div>
<div dir="auto">RedIODev </div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</body></html>