<html><body><div id="zimbraEditorContainer" style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000" class="3"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>De: </b>"Brian Goetz" <brian.goetz@oracle.com><br><b>À: </b>"Remi Forax" <forax@univ-mlv.fr><br><b>Cc: </b>"Kevin Bourrillion" <kevinb@google.com>, "Guy Steele" <guy.steele@oracle.com>, "amber-spec-experts" <amber-spec-experts@openjdk.java.net><br><b>Envoyé: </b>Vendredi 11 Mai 2018 02:25:47<br><b>Objet: </b>Re: Treatment of nested 'break'<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;">While “no new keywords” is not a hard and fast rule, remember that the cost of adding conditional keywords is between 10x and 1000x of that of reusing an existing keyword (depending on where it occurs in the grammar.)  So its fine to suggest alternatives, but bear in mind that alternatives are by no means cost-free.  (When we suggest new keywords, we’ve already done the cost analysis to ensure its at the low end of the spectrum.)  </blockquote><div><br></div><div>yes,<br data-mce-bogus="1"></div><div>at the same time, people use keywords as a gateway for the semantics, so re-using a keyword with a different semantics may cost a lot in term of debugging time.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Anyway, sleeping on this problem the last night remember me that there is another view of this issue.</div><div>One thing i've remarked with the introduction of 'var' is that writing expression oriented codes helps a lot,<br data-mce-bogus="1"></div><div>by example, instead of<br data-mce-bogus="1"></div><div>  List<String> list;<br data-mce-bogus="1"></div><div>  if (foo) {<br data-mce-bogus="1"></div><div>    list = ...<br data-mce-bogus="1"></div><div>  } else {<br data-mce-bogus="1"></div><div>    list = ...<br data-mce-bogus="1"></div><div>  }<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>it's easier to write<br data-mce-bogus="1"></div><div>  var list = (foo)? ...: ...;<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>there is another construction in Java apart switch that may need an expression version, the try syntax (and its brother the try-with-resources)<br data-mce-bogus="1"></div><div>using the same example as above, instead of<br data-mce-bogus="1"></div><div>  List<String> list;<br data-mce-bogus="1"></div><div>  try {<br data-mce-bogus="1"></div><div>    list = ...<br data-mce-bogus="1"></div><div>  } catch(IOException e) {<br data-mce-bogus="1"></div><div>    list = ...<br data-mce-bogus="1"></div><div> }<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>it's easier to write<br data-mce-bogus="1"></div><div>  var list = try { break ... } catch(IOException e) { break ... };</div><div><br data-mce-bogus="1"></div><div>My fear is that if we use break as identifier, it works for 'switch' but not that well for 'try'.</div><div><br data-mce-bogus="1"></div><div>I do not suggest that we should implement try expression, just that 'break' makes less sense if one time we want to retrofit try to introduce a try expression.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>regards,<br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div class=""><br class=""><div><blockquote class=""><div class="">On May 10, 2018, at 7:20 PM, Remi Forax <<a href="mailto:forax@univ-mlv.fr" class="" target="_blank">forax@univ-mlv.fr</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="Apple-interchange-newline"><br class=""></div><hr id="zwchr" style="font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div style="font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote style="border-left-width: 2px; border-left-style: solid; border-left-color: rgb(16, 16, 255); margin-left: 5px; padding-left: 5px; font-weight: normal; font-style: normal; text-decoration: none; font-family: Helvetica, Arial, sans-serif; font-size: 12pt;" class=""><b class="">De:<span class="Apple-converted-space"> </span></b>"Brian Goetz" <<a href="mailto:brian.goetz@oracle.com" class="" target="_blank">brian.goetz@oracle.com</a>><br class=""><b class="">À:<span class="Apple-converted-space"> </span></b>"Kevin Bourrillion" <<a href="mailto:kevinb@google.com" class="" target="_blank">kevinb@google.com</a>>, "Guy Steele" <<a href="mailto:guy.steele@oracle.com" class="" target="_blank">guy.steele@oracle.com</a>><br class=""><b class="">Cc:<span class="Apple-converted-space"> </span></b>"amber-spec-experts" <<a href="mailto:amber-spec-experts@openjdk.java.net" class="" target="_blank">amber-spec-experts@openjdk.java.net</a>><br class=""><b class="">Envoyé:<span class="Apple-converted-space"> </span></b>Jeudi 10 Mai 2018 22:04:15<br class=""><b class="">Objet:<span class="Apple-converted-space"> </span></b>Re: Treatment of nested 'break'<br class=""></blockquote></div><div style="font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote style="border-left-width: 2px; border-left-style: solid; border-left-color: rgb(16, 16, 255); margin-left: 5px; padding-left: 5px; font-weight: normal; font-style: normal; text-decoration: none; font-family: Helvetica, Arial, sans-serif; font-size: 12pt;" class=""><tt class="">This might not help, but perhaps think of it as a compound keyword; "break switch" is not "break with an argument of switch", but a multi-word keyword itself. <span class="Apple-converted-space"> </span><br class=""><br class="">(Back in lambda, when we explored the consequence of using "return" in lambda, and observed it foreclosed on nonlocal return should we ever want to get there, we briefly discussed "long return" as a compound keyword for that case.  Same game.) <span class="Apple-converted-space"> </span><br class=""><br class="">Personally if I saw "break while", I think I'd immediately know what that means, and might even thank the author for being clear. </tt></blockquote><div class=""><br class=""></div><div class="">You can also use any other word instead of break or break switch.<br class=""></div><div class="">By example,<br class=""></div><div class="">  breakswitch 3;<br class=""></div><div class=""><br class=""></div><div class="">Rémi<br class=""></div><br class=""><blockquote style="border-left-width: 2px; border-left-style: solid; border-left-color: rgb(16, 16, 255); margin-left: 5px; padding-left: 5px; font-weight: normal; font-style: normal; text-decoration: none; font-family: Helvetica, Arial, sans-serif; font-size: 12pt;" class=""><br class=""><div class="moz-cite-prefix">On 5/10/2018 3:57 PM, Kevin Bourrillion wrote:<br class=""></div><blockquote cite="mid:CAGKkBksuD+Ufb48t8wUbqvxGsVZ+b60BJj97dYv8f_S0gkXvbg@mail.gmail.com" class=""><div dir="ltr" class="">I'm just going to say that naming a keyword as the argument of another keyword seems novel and unprecedented for Java, and as such I think should require pretty strong justification.<div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, May 10, 2018 at 12:12 PM, Guy Steele<span class="Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:guy.steele@oracle.com" target="_blank" class="">guy.steele@oracle.com</a>></span><span class="Apple-converted-space"> </span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"><div class="HOEnZb"><div class="h5"><br class="">> On May 10, 2018, at 3:06 PM, Brian Goetz <<a href="mailto:brian.goetz@oracle.com" target="_blank" class="">brian.goetz@oracle.com</a>> wrote:<br class="">><span class="Apple-converted-space"> </span><br class="">><span class="Apple-converted-space"> </span><br class="">>> I think these are both valid explanations, with different outcomes, but anyway it's fair to say that it would be confusing to have the latter perspective and then try to explain how a value break can get past a surrounding 'for' loop.<br class="">><span class="Apple-converted-space"> </span><br class="">> One option is: you can't.  While I agree there is code that one might like to write that is made cumbersome by this, it's a valid option, and not one that is utterly terrible.<br class="">><span class="Apple-converted-space"> </span><br class="">> Another option is to extend the break syntax along the lines of the proposed continue syntax.  Suppose for every continuable construct x (for, while, switch) we supported "continue x".  So for every breakable construct y we could support "break y".  If a for loop were enclosed in an expression switch, you could then say "break switch e".  Then<br class="">><span class="Apple-converted-space"> </span><br class="">>    if (foo)<br class="">>        break;<br class="">>    else<br class="">>        break 3;<br class="">><span class="Apple-converted-space"> </span><br class="">> becomes<br class="">><span class="Apple-converted-space"> </span><br class="">>    if (foo)<br class="">>        break for;<br class="">>    else<br class="">>        break switch 3;<br class="">><span class="Apple-converted-space"> </span><br class="">> and it is much more obvious what is going on.<br class=""><br class=""></div></div>If we are willing to pile up keywords in that manner, an alternate possibility is to spell a value-returning break in a different way:<br class=""><br class="">        return switch <expression>;<br class=""><br class="">Then your example can become (I have added the implicit context):<br class=""><br class="">        switch (…) { case 17 -> {<br class="">                …<br class="">                for (…) {<br class="">                   ...<br class="">                   if (foo)<br class="">                       break;<br class="">                   else<br class="">                       return switch 3;<br class="">                … }<br class="">            … }<br class="">        … }<br class=""><br class="">The additional advantage of this approach is that it completely eliminates the syntactic ambiguity between<br class=""><br class="">        break variableName;<br class=""><br class="">and<br class=""><br class="">        break labelName;<br class=""><br class="">Given that we think most occurrences of “return switch” (or “switch return”, take your pick) will be abbreviated by -> anyway, this might be an acceptable approach.<br class=""><br class="">You can then still choose to go ahead and also allow things like<br class=""><br class="">        break for;<br class="">        break switch;<br class="">        break while;<br class="">        continue for;<br class="">        continue switch;<br class=""><br class="">but that can be a separate decision; these become simply a way to avoid using statement labels.<br class=""><span class="HOEnZb"><span style="color: rgb(136, 136, 136);" class=""><br class="">—Guy<br class=""><br class=""></span></span></blockquote></div><br class=""><br class="" clear="all"><div class=""><br class=""></div>--<span class="Apple-converted-space"> </span><br class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div style="line-height: 1.5em; padding-top: 10px; margin-top: 10px; color: rgb(85, 85, 85); font-family: sans-serif;" class=""><span style="border-width: 2px 0px 0px; border-style: solid; border-color: rgb(213, 15, 37); padding-top: 2px; margin-top: 2px;" class="">Kevin Bourrillion |</span><span style="border-width: 2px 0px 0px; border-style: solid; border-color: rgb(51, 105, 232); padding-top: 2px; margin-top: 2px;" class=""> Java Librarian |</span><span style="border-width: 2px 0px 0px; border-style: solid; border-color: rgb(0, 153, 57); padding-top: 2px; margin-top: 2px;" class=""> Google, Inc. |</span><span style="border-width: 2px 0px 0px; border-style: solid; border-color: rgb(238, 178, 17); padding-top: 2px; margin-top: 2px;" class=""> <a href="mailto:kevinb@google.com" target="_blank" class="">kevinb@google.com</a></span><br data-mce-bogus="1"></div></div></div></div></div></div></div></div></blockquote></blockquote></div></div></blockquote></div><br class=""></div><br></blockquote></div></div></body></html>