Call for bikeshed -- break replacement in expression switch

Guy Steele guy.steele at oracle.com
Mon May 13 19:08:48 UTC 2019



> On May 13, 2019, at 10:28 AM, Doug Lea <dl at cs.oswego.edu> wrote:
> 
> 
> Having lost (nearly) this argument years ago, I'm not sure why I bother, but ...
> 
> On 5/12/19 3:38 PM, Brian Goetz wrote:
>> 
>> Looking at what other languages have done here, there are a few broad directions: 
>> 
>>  - A statement like “break-with v”, indicating that the enclosing structured expression is completing normally with the provided value.  
>>  - An operator that serves the same purpose, such as “-> e”.
>>  - Assigning to some magic variable (this is how Pascal indicates the return value of a function).  
>>  - Treating the last expression in the block as the result.  
> 
> (The last one being "progn", the earliest and arguably still best of these.)
> 
>> 
>> I think we can dispatch all but the first relatively easily: ...
>> 
>> 
>>  - Everywhere else in the language (such as method bodies), you are free to yield up a value from the middle of the block, perhaps from within a control construct like a loop; restricting the RHS of case blocks to put their result last would be a significant new restriction, and would limit the ability to refactor to/from methods. And further, the convention of putting the result last, while a fine one for a language that is “expressions all the way down”, would likely be too subtle a cue in Java.  
> 
> Last time around, the last point about subtlety and odd-lookingness of progn seemed to bother people the most.  It is possible to make it  less subtle by additionally requiring some symbol. Prefix "^" is still available. Allowing for example:
> 
> 
>     String s = (foo != null) 
>         ? s
>         : { println(“null again at line” + __LINE__);  ^ “null”;  };
> 
> Which still lgtm….

Could be worse, but looks to be like Java with a Smalltalk accent—just as

	{ foo(); bar }

is Java with a Lisp (or ECL) accent.  I would prefer to adapt a bit of syntax from ECL: the statement

	b => e;

evaluates b as a boolean expression, and if it is true, then e is evaluated and its value becomes the value of the block.  This gives you a syntax very similar to that of Lisp COND:

	{ x > y => 1; x < y => -1; true => 0; }

If you then want to further abbreviate “true =>”, well, that’s another story, but I wouldn’t blame you.

—Guy


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20190513/554b4432/attachment-0001.html>


More information about the amber-spec-experts mailing list