do expression

Tagir Valeev amaembo at gmail.com
Tue Mar 24 03:42:39 UTC 2020


Hello, Guy!

I think, the same problem was already solved when we differentiate
between switch expression and switch statement. In particular, this
syntax is invalid:

switch (0) {
    default -> {
        yield " foo ";
    }
}.trim();

You must parenthesize the qualifier:

(switch (0) {
    default -> {
        yield " foo ";
    }
}).trim();

The same should be done with the proposed do-expression:

(do { blah blah blah;
  if (p) yield myCollection;
  blah blah blah;
  yield otherCollection;
}).add(x);

This allows to syntactically separate do-expression and do-while statement.

With best regards,
Tagir Valeev

On Tue, Mar 24, 2020 at 10:00 AM Guy Steele <guy.steele at oracle.com> wrote:
>
> 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
>
> What do you think?
>
> With best regards,
> Tagir Valeev
>
>


More information about the amber-spec-experts mailing list