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