<html><head>
<meta content="text/html; charset=windows-1252" 
http-equiv="Content-Type">
</head><body bgcolor="#FFFFFF" text="#000000">
<blockquote style="border: 0px none;" 
cite="mid:9FA79207-E937-4F16-B40D-780BE482D574@rauschma.de" 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="axel@rauschma.de" photoname="Axel Rauschmayer" 
src="cid:part1.02070900.07000601@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:axel@rauschma.de" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Axel Rauschmayer</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 14, 2012 
12:35 PM</span></font></div></div></div>
  <div style="color: rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;" __pbrmquotes="true" class="__pbConvBody"><div><br>
    <div>This *may* not violate TCP (I'm not quite sure), but I'm not 
enthusiastic about the idea. The semantics is significantly more 
complicated, and it requires you to understand whether a higher-order 
function like forEach is catching these exceptions or not. So it becomes
 an additional part of the API of a function. If someone doesn't 
document what they do with BreakException and ContinueException, then 
writing callbacks you won't actually be able to predict what `break` and
 `continue` will do.<br></div>
</div></div>
</blockquote>
<br>
See Allen's post for how this does not compose well.<br>
<blockquote style="border: 0px none;" 
cite="mid:9FA79207-E937-4F16-B40D-780BE482D574@rauschma.de" type="cite">
  <div style="color: rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;" __pbrmquotes="true" class="__pbConvBody">
    <div><div><br></div><div>I donít think itís a must-have, but 
whenever you catch exceptions, you have similar issues.</div></div>
  </div>
</blockquote>
<br>
Sorry, termination style exception handling is pretty much a failure 
outside of local protocols with automated catching (for/of in Harmony 
loops, comprehensions, and generator expressions).<br>
<br>
People build local ad-hoc try/catch machines, e.g. for generator 
schedulers, and those can be managed even without syntax, but these 
"kernels" require expertise and careful API design.<br>
<br>
But in general when you see a try/catch, the catch is empty and the try 
is because of a call out of module or ownable unit of code, into some 
hostile subsystem or "other" that has in the past thrown a random 
exception.<br>
<br>
IOW, termination-style exception handling does not scale. It's also a 
dynamic thing, like magic return codes. Intervening functions on the 
call stack with no necessary static relation to one another may have to 
try and catch (or at least try and finally) to unwind-protect. Not for 
memory management, of course, but for other mandatory protocols such as 
RAII patterns.<br>
<br>
So I'm against adding BreakException and ContinueException and defining 
block-lambda break and continue in terms of throw. As Dave and Allen 
argued, this enlarges the contract of every possible intervening 
function to include exceptions. Exceptions are usually ignored at high 
level, used only locally (across shallow continuation calls).<br>
<br>
We should avoid adding dependencies on exceptions that must be managed 
by arbitrarily large codebases and arbitrarily deep callstacks.<br>
<br>
/be<br>
<blockquote style="border: 0px none;" 
cite="mid:9FA79207-E937-4F16-B40D-780BE482D574@rauschma.de" type="cite">
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody"><br><div 
apple-content-edited="true">
<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; " class="Apple-style-span"><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div 
style="word-wrap: break-word; -webkit-nbsp-mode: space; 
-webkit-line-break: after-white-space; "><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; " 
class="Apple-style-span"><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 style="font-size: medium; " 
class="Apple-style-span"><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 
moz-do-not-send="true" 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
 moz-do-not-send="true" href="http://rauschma.de">rauschma.de</a></div>twitter:
 <a moz-do-not-send="true" 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 moz-do-not-send="true" 
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><pre wrap="">_______________________________________________
es-discuss mailing list
<a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a>
<a class="moz-txt-link-freetext" href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a>
</pre></div>
  <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="dherman@mozilla.com" photoname="David Herman" 
src="cid:part2.06090501.08060902@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:dherman@mozilla.com" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">David Herman</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 14, 2012 
9:12 AM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody"><div><!----><br>If I understand
 your suggestion, you're proposing that non-local break and continue 
should be exposed as standard exceptions, and then implementors of 
loop-like abstractions could choose to catch them. E.g. you could 
implement forEach as:<br><br>    Array.prototype.forEach = function(f) {<br>
        for (let i = 0, n = this.length; i < n; i++) {<br>           
 try {<br>                f.call(this, this[i], i);<br>            } 
catch (e) {<br>                if (e instanceof BreakException)<br>     
               break;<br>                else if (e instanceof 
ContinueException)<br>                    continue;<br>                
else<br>                    throw e;<br>            }<br>        }<br>  
  };<br><br>Whereas a function that does *not* want to expose whether 
it's using loops would simply do nothing with BreakException and 
ContinueException, and they would propagate out and you'd get the 
lexical scoping semantics. Meanwhile, break/continue with an explicit 
target would never be catch-able.<br><br>Did I understand your 
suggestion correctly?<br><br>This *may* not violate TCP (I'm not quite 
sure), but I'm not enthusiastic about the idea. The semantics is 
significantly more complicated, and it requires you to understand 
whether a higher-order function like forEach is catching these 
exceptions or not. So it becomes an additional part of the API of a 
function. If someone doesn't document what they do with BreakException 
and ContinueException, then writing callbacks you won't actually be able
 to predict what `break` and `continue` will do.<br><br>Dave<br><br><br></div></div>
  <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="axel@rauschma.de" photoname="Axel Rauschmayer" 
src="cid:part1.02070900.07000601@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:axel@rauschma.de" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Axel Rauschmayer</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 13, 2012 
9:04 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody">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><br 
class="Apple-interchange-newline"></div><br><div 
apple-content-edited="true">
<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; " class="Apple-style-span"><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div style="word-wrap: 
break-word; -webkit-nbsp-mode: space; -webkit-line-break: 
after-white-space; "><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; " class="Apple-style-span"><div 
style="word-wrap: break-word; -webkit-nbsp-mode: space; 
-webkit-line-break: after-white-space; "><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; " 
class="Apple-style-span"><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 style="font-size: medium; " 
class="Apple-style-span"><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 
moz-do-not-send="true" 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
 moz-do-not-send="true" href="http://rauschma.de">rauschma.de</a></div>twitter:
 <a moz-do-not-send="true" 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 moz-do-not-send="true" 
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></div>
  <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="brendan@mozilla.org" photoname="Brendan Eich" 
src="cid:part4.09070000.01050705@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:brendan@mozilla.org" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Brendan Eich</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 13, 2012 
8:54 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody">
<meta http-equiv="Content-Type" content="text/html; 
charset=windows-1252">

<blockquote type="cite" 
cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com"
 style="border: 0px none;"><div class="__pbConvHr" style="margin:30px 
25px 10px 25px;"><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
 moz-do-not-send="true" name="compose-unknown-contact.jpg" 
src="cid:part5.07030501.06070303@mozilla.org" photoname="Grant Husbands"
 photoaddress="esdiscuss@grant.x43.net" height="25px" width="25px"></div>
   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;" href="mailto:esdiscuss@grant.x43.net" 
moz-do-not-send="true">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 class="__pbConvBody" __pbrmquotes="true" style="color: rgb(136, 
136, 136); margin-left: 24px; 
margin-right: 24px;">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 type="cite" 
cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com"
 style="border: 0px none;">
  <div class="__pbConvBody" __pbrmquotes="true" style="color: rgb(136, 
136, 136); margin-left: 24px; 
margin-right: 24px;"> 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 type="cite" 
cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com"
 style="border: 0px none;">
  <div class="__pbConvBody" __pbrmquotes="true" style="color: rgb(136, 
136, 136); margin-left: 24px; 
margin-right: 24px;">
<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 type="cite" 
cite="mid:CAOjLovh3-OP-iq5pgt3DChR60MWsVdz9eGcwBpj386+P-vS8WQ@mail.gmail.com"
 style="border: 0px none;">
  <div class="__pbConvBody" __pbrmquotes="true" 
style="color:#888888;margin-left:24px;margin-right:24px;">
    <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>
  <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" 
src="cid:part5.07030501.06070303@mozilla.org" 
name="compose-unknown-contact.jpg" height="25px" width="25px"></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:#888888;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) 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><br></div><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, however that loop is 
constructed.</div>
<div><br></div><div>Note that the label-based break/continue could still
 have the desired effect, if the proposal was updated to be more like 
Ruby's blocks.</div><div><br></div><div>I don't have a strong opinion on
 the subject, but I hadn't noticed the above being discussed, elsewhere,
 and thought it worth raising. If there is a better place for me to 
raise this, please let me know where and accept my apologies.</div>
<div><br></div><div>Regards,</div><div>Grant Husbands.</div>

<div>_______________________________________________<br>es-discuss 
mailing list<br><a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br><a class="moz-txt-link-freetext" href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br></div></div>
</blockquote>
</body></html>