<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I think itís a valid concern. The idea is: If I can implement my own loops (the nice-looking paren-free syntax feeds that illusion!) then I also want those loops to have break and continue. You could statically determine what construct, say, a break applies to and either throw a BreakException (if it applies to a lambda) or TCP-break (if it applies to an enclosing non-lambda loop). In the examples below, when I see a continue, I look for the innermost enclosing loop braces and the ones belong to list[i].forEach are definitely candidates.<div><br><div><div>On Jan 14, 2012, at 5:54 , Brendan Eich wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<div bgcolor="#FFFFFF" text="#000000">
<blockquote style="border: 0px none;" cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com" type="cite">
  <div style="margin:30px 25px 10px 25px;" class="__pbConvHr"><div style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px">       <div style="display:table-cell;vertical-align:middle;padding-right:6px;"><img photoaddress="esdiscuss@grant.x43.net" photoname="Grant Husbands" name="compose-unknown-contact.jpg" height="25px" width="25px" id="302c0ff1-5a5d-45bf-b282-bb1a36588a7f" src="cid:part1.05090408.00030509@mozilla.org"></div>   <div style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:esdiscuss@grant.x43.net" style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Grant Husbands</a></div>   <div style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 13, 2012 
7:29 PM</span></font></div></div></div>
  <div style="color: rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;" __pbrmquotes="true" class="__pbConvBody">Block 
lambdas have been a hot topic, recently, but there's a point of 
significant divergence between Ruby (which appears to be the 
inspiration)</div>
</blockquote>
<br>
Not Ruby alone, and not in any chauvinist my-language-is-better sense. 
Smalltalk is the original inspiration for Ruby blocks, and the 
correspondence principle has deep roots.<br>
<br>
<blockquote style="border: 0px none;" cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com" type="cite">
  <div style="color: rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;" __pbrmquotes="true" class="__pbConvBody"> and the 
proposed solution, in the handling of continue (called 'next', in Ruby) 
and 'break'.<div>
<br></div><div>To whit: In Ruby, 'next' will end the current run 
(iteration) of the block, and 'break' will (somehow) terminate the 
method lexically connected with the block. It can be claimed that this 
is more intuitive than the current proposal, which aims to make 'break' 
and 'continue' propagate through block lambdas in the same way 'return' 
would.</div></div>
</blockquote>
<br>
"Intuitive" depends on intuition, which is not well-defined. Do you mean
 a Rubyist might expect different behavior for break? That is possible 
but JS ain't Ruby and break should not change to do something like what 
it does in Ruby (and we aren't defining a next equivalent for JS).<br>
<br>
<blockquote style="border: 0px none;" cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com" type="cite">
  <div style="color: rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;" __pbrmquotes="true" class="__pbConvBody">
<div>Ruby does also support syntactic loops and the same keywords 
therein and so directly violates Tennent's Correspondence Principle, 
even though such has been touted as a core reason for the construct. 
Instead, I believe it reasonable to invoke intuition in this matter. It 
is intuitive for 'return' to return a value from the lexically enclosing
 method and it is intuitive for 'continue' to commence the next 
iteration of the current loop,</div></div>
</blockquote>
<br>
Wait, why do you think break and continue without label operands do 
anything other than break from the nearest enclosing loop (or switch or 
labeled statement if break), or continue the nearest enclosing loop? The
 proposal specifies this.<br>
<br>
<span style="font-family: monospace;">function 
find_odds_in_arrays(list,        // array of arrays</span><br style="font-family: monospace;">
<span style="font-family: monospace;">                             
skip)        // if found, skip rest</span><br style="font-family: 
monospace;">
<span style="font-family: monospace;">{</span><br style="font-family: 
monospace;">
<span style="font-family: monospace;">  let a = [];</span><br style="font-family: monospace;">
<span style="font-family: monospace;">  for (let i = 0; i < 
list.length; i++) {</span><br style="font-family: monospace;">
<span style="font-family: monospace;">    list[i].forEach {</span><br style="font-family: monospace;">
<span style="font-family: monospace;">      |e|</span><br style="font-family: monospace;">
<span style="font-family: monospace;">      if (e === skip) {</span><br style="font-family: monospace;">
<span style="font-family: monospace;">        
continue;                         // continue the for loop</span><br style="font-family: monospace;">
<span style="font-family: monospace;">      }</span><br style="font-family: monospace;">
<span style="font-family: monospace;">      if (e & 1) {</span><br style="font-family: monospace;">
<span style="font-family: monospace;">        a.push(e);</span><br style="font-family: monospace;">
<span style="font-family: monospace;">      }</span><br style="font-family: monospace;">
<span style="font-family: monospace;">    }</span><br style="font-family: monospace;">
<span style="font-family: monospace;">  }</span><br style="font-family: 
monospace;">
<span style="font-family: monospace;">  return a;</span><br style="font-family: monospace;">
<span style="font-family: monospace;">}</span><br style="font-family: 
monospace;">
<br>
<span><span style="font-family: monospace;">function 
find_more_odds(list, stop) {</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">  let a = [];</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">  for (let i = 0; i < 
list.length; i++) {</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">    list[i].forEach {</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">      |e|</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">      if (e === stop) {</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">        
break;                      // break from the for loop</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">      }</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">      if (e & 1) {</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">        a.push(e);</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">      }</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">    }</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">  }</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">  return a;</span><br style="font-family: monospace;">
  <span style="font-family: monospace;">}</span><br style="font-family: 
monospace;">
<br>
<blockquote style="border: 0px none;" cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com" type="cite">
  <div style="color:#888888;margin-left:24px;margin-right:24px;" __pbrmquotes="true" class="__pbConvBody">
    <div>however that loop is constructed.</div>
  </div>
</blockquote></span><br>
What do you mean by this? The spec talks about nearest enclosing loop or
 relevant control structure in the source code. Are you talking about 
internal loops in implementations (dynamically dispatched at that) of 
methods that take block-lambdas as arguments? I.e.<br>
<br>
<br>
<span style="font-family: monospace;">function find_first_odd(a) {</span><br style="font-family: monospace;">
<span style="font-family: monospace;">  a.forEach { |e, i|</span><br style="font-family: monospace;">
<span style="font-family: monospace;">              if (e & 1) 
return i; }  // returns from function</span><br style="font-family: 
monospace;">
<span style="font-family: monospace;">  return -1;</span><br style="font-family: monospace;">
<span style="font-family: monospace;">}</span><br style="font-family: 
monospace;">
<br>
<br>
The Array.prototype.forEach method's internal implementation is its 
business, and a break instead of the return would be a static error in 
this example. It would not be a dynamic throw-like construct that is 
caught by forEach's implementation.<br>
<br>
/be<br>
</div>_______________________________________________<br>es-discuss mailing list<br><a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>https://mail.mozilla.org/listinfo/es-discuss<br></blockquote></div><br><div apple-content-edited="true">
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-style-span" style="font-size: medium; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">-- </div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Dr. Axel Rauschmayer</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><a href="mailto:axel@rauschma.de">axel@rauschma.de</a></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">home: <a href="http://rauschma.de">rauschma.de</a></div>twitter: <a href="http://twitter.com/rauschma">twitter.com/rauschma</a></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">blog: <a href="http://2ality.com">2ality.com</a></div></span></div></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></div></span></span>
</div>
<br></div></body></html>