do expression
Guy Steele
guy.steele at oracle.com
Tue Mar 24 03:00:40 UTC 2020
There are many ways to invent a syntax for embedding a block within an expression (gcc allows a block to appear within immediately enclosing parentheses), but using the “do” keyword could be problematic within Java because in principle there could be some confusion with the “do { … } while(x)” statement. Consider the statement:
do { blah blah blah;
if (p) yield myCollection;
blah blah blah;
yield otherCollection;
}.add(x);
It sure looks like a loop until you get to that last line and realize it’s really an expression statement.
—Guy
> On Mar 23, 2020, at 10:23 PM, Tagir Valeev <amaembo at gmail.com> wrote:
>
> Hello!
>
> Now we have a legal way to execute several statements within an expression, yielding the result with a yield statement. This could be done via `switch` expression.
>
> Sometimes it's desired to do this without any switch. One may abuse the switch expression feature writing `switch(0) { default -> { ... code block ending with 'yield' }}`.
>
> How about creating a special syntax for such kind of expression. It could look like `do { ... code block ending with 'yield' }`?
>
> E.g. consider:
>
> class X {
> static final String field;
>
> // now we are forced to split field declaration and initialization
> // also initializer could be long and it could be not evident that its main purpose
> // is to initialize the field
> static {
> try {
> field = initializeField();
> }
> catch(CheckedException e) {
> throw new RuntimeException(e);
> }
> }
> }
>
> Since Java 14 we can write
>
> class X {
> // field declaration and initialization in the same place: easier to navigate through code
> // though we are abusing the switch expression
> static final String field = switch(0) { default -> {
> try {
> yield initializeField();
> }
> catch(CheckedException e) {
> throw new RuntimeException(e);
> }
> }};
> }
>
> It could be like
>
> class X {
> // concise syntax. Now we know that the main block purpose
> // is to initialize the field
> static final String field = do {
> try {
> yield initializeField();
> }
> catch(CheckedException e) {
> throw new RuntimeException(e);
> }
> };
> }
>
> It's similar to Perl 'do BLOCK' expression
> https://perldoc.perl.org/functions/do.html <https://perldoc.perl.org/functions/do.html>
>
> What do you think?
>
> With best regards,
> Tagir Valeev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20200323/b53606cd/attachment.htm>
More information about the amber-spec-experts
mailing list