<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Okay, Maurizio, you got me thinking.  As long as we are convinced that we are actually going to use an explicit value-returning statement within a switch expression quite infrequently in real code, why don’t we get the best of both worlds by spelling it this way:<div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>break return x;</div><div class=""><br class=""></div><div class="">Then everybody is happy:</div><div class="">(1) Cannot be confused with the old `break` syntax.</div><div class="">(2) Clearly exits a `switch` like `break` does.</div><div class="">(3) Clearly returns a value like `return` does.</div><div class="">(4) Better encourages exclusive use of `->` (because using `->` rather than `: break return` saves even more characters than using `->` rather than `: break`).</div><div class="">(5) In the year 2364, this can be further generalized to allow `continue return x;`.</div><div class="">(6) Those who want new language features to really jump out will surely be satisfied.</div><div class=""><br class=""></div><div class="">—Guy</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Mar 15, 2018, at 5:13 PM, Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" class="">maurizio.cimadamore@oracle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" class="">
  
  <div text="#000000" bgcolor="#FFFFFF" class=""><p class="">So, from a language design perspective, 'return x' is wrong -
      but, as you point out, we already committed the original sin of
      having 'return == local return' for lambdas, so I'm not too
      convinced that we couldn't use the same story again here. E.g.
      when you say 'return', what you really mean is 'returning from the
      innermost context'. This could be a method (as usual), or a nested
      expression e.g. a lambda or a switch expression.</p><p class="">Kevin has a point in that using return is mildly worrisome when
      it comes to refactoring; but we had exactly the same problem with
      lambdas when we were considering migrating code using internal
      iteration (for loop) to code using external iteration (Stream
      forEach) - again, there the refactoring could not be 100% smooth -
      if the body of your loop had some abnormally completing branches,
      then there was no way to translate that into an external iteration
      idiom - at least not mechanically (e.g. 'return x' already meant
      something different inside old-style for loop bodies).</p><p class="">So, seems to me that we end up with the same bag of pros and
      cons? E.g. more familiar to the user (return <expr> is
      something that they know and love), but more smelly from a design
      point of view (in a way that forecloses using 'return' to mean
      non-local return, but I wonder - has that ship already sailed?)</p><p class="">Maurizio<br class="">
    </p></div></div></blockquote></div><br class=""></div></body></html>