<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="markdown-here-wrapper" data-md-url="" style="">
      <p style="margin: 0px 0px 1.2em !important;">On 21/10/2024 15:39,
        Archie Cobbs wrote:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:CANSoFxt55VfD0HUfJ+8P3AGxBdwaLiiKYUHHjaypY3fov3grPw@mail.gmail.com">
          <div dir="ltr">
            <div class="gmail_quote">
              <div>I'm saying something different from that... and also
                simpler.<br>
              </div>
              <div><br>
              </div>
              <div>Let's restate the conjecture: Suppose we changed the
                requirement for lambda capture of a variable from "final
                or effectively final" to "final or effectively frozen at
                the point of capture", where "effectively frozen at the
                point of capture" means there are no mutations to the
                variable that lexically follow the capturing lambda.<br>
              </div>
              <div><br>
              </div>
              <div>Then this would clearly subsume what's proposed in
                JDK-8341785 (basic for() loop variables are capturable)
                - it's a strict expansion of that.</div>
              <div><br>
              </div>
              <div>So no special treatment of loop induction variables
                is needed.<br>
              </div>
            </div>
          </div>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <p style="margin: 0px 0px 1.2em !important;">I’m not sure of that.
        I mean, I “can see” why you’d think that. But in which scope
        does STEP belong? Yes, it belongs to the for loop header - but
        it is executed <em>after</em> the loop. And, in fact, it can
        even refer to variables that would otherwise be DU outside the
        loop body:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">void m() {
   int i;
   for (int j = 0 ; j < 10 ; j = j + i) {
      i = 1; // if this is commented out, error!
   }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">So I’m not sure it is
        a <em>strict</em> generalization :-)</p>
      <p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:CANSoFxt55VfD0HUfJ+8P3AGxBdwaLiiKYUHHjaypY3fov3grPw@mail.gmail.com">
          <div dir="ltr">
            <div class="gmail_quote">
              <div><br>
              </div>
              <div>Not only that, even though it's broader, it's a much
                simpler requirement that has no dependence on DA/DU
                analysis or any kind of flow analysis.<br>
              </div>
              <div><br>
              </div>
              <div>So I'm saying that this "space" interpretation -
                which is strictly lexical - is superior because it has
                all of the following nice attributes:</div>
              <div>
                <ul>
                  <li>It solves the original problem - allow capture of
                    basic for() loop variables mutated only in the loop
                    header</li>
                  <li>It also solves a much wider set of "dummy
                    variable" cases in other code (e.g., do and while
                    loops, and all but 5 of the METHODREF examples in
                    the JDK)</li>
                  <li>Yet it still seems to closely match developer
                    intuition - or at least, no less closely than the
                    previous more limited basic for() loop proposal does<br>
                  </li>
                  <li>It is very simple to specify and understand</li>
                </ul>
              </div>
            </div>
          </div>
          <div>The upshot is: If one were to evaluate possible
            replacements for the "final or effectively final"
            requirement for variable capture, in my opinion this would
            be a promising option - and in particular has a much higher
            cost/benefit ratio than the earlier proposal of just
            addressing basic for() loop variables.<br>
          </div>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div title="MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDIxLzEwLzIwMjQgMTU6
MzksIEFyY2hpZSBDb2JicyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIg
Y2l0ZT0ibWlkOkNBTlNvRnh0NTVWZkQwSFVmSis4UDNBR3hCZHdhTGlpS1lVSEhqYXlwWTNmb3Yz
Z3JQd0BtYWlsLmdtYWlsLmNvbSI+PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfcXVv
dGUiPjxkaXY+SSdtIHNheWluZyBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gdGhhdC4uLiBhbmQg
YWxzbyBzaW1wbGVyLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkxldCdzCiByZXN0YXRl
IHRoZSBjb25qZWN0dXJlOiBTdXBwb3NlIHdlIGNoYW5nZWQgdGhlIHJlcXVpcmVtZW50IGZvciBs
YW1iZGEgCmNhcHR1cmUgb2YgYSB2YXJpYWJsZSBmcm9tICJmaW5hbCBvciBlZmZlY3RpdmVseSBm
aW5hbCIgdG8gImZpbmFsIG9yIAplZmZlY3RpdmVseSBmcm96ZW4gYXQgdGhlIHBvaW50IG9mIGNh
cHR1cmUiLCB3aGVyZSAiZWZmZWN0aXZlbHkgZnJvemVuIAphdCB0aGUgcG9pbnQgb2YgY2FwdHVy
ZSIgbWVhbnMgdGhlcmUgYXJlIG5vIG11dGF0aW9ucyB0byB0aGUgdmFyaWFibGUgCnRoYXQgbGV4
aWNhbGx5IGZvbGxvdyB0aGUgY2FwdHVyaW5nIGxhbWJkYS48YnI+PC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5UaGVuCiB0aGlzIHdvdWxkIGNsZWFybHkgc3Vic3VtZSB3aGF0J3MgcHJvcG9zZWQg
aW4gSkRLLTgzNDE3ODUgKGJhc2ljIGZvcigpIApsb29wIHZhcmlhYmxlcyBhcmUgY2FwdHVyYWJs
ZSkgLSBpdCdzIGEgc3RyaWN0IGV4cGFuc2lvbiBvZiB0aGF0LjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+U28gbm8gc3BlY2lhbCB0cmVhdG1lbnQgb2YgbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGVz
IGlzIG5lZWRlZC48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxwPkknbSBub3Qg
c3VyZSBvZiB0aGF0LiBJIG1lYW4sIEkgImNhbiBzZWUiIHdoeSB5b3UnZCB0aGluayB0aGF0LiBC
dXQgaW4gd2hpY2ggc2NvcGUgZG9lcyBTVEVQIGJlbG9uZz8gWWVzLCBpdCBiZWxvbmdzIHRvIHRo
ZSBmb3IgbG9vcCBoZWFkZXIgLSBidXQgaXQgaXMgZXhlY3V0ZWQgX2FmdGVyXyB0aGUgbG9vcC4g
QW5kLCBpbiBmYWN0LCBpdCBjYW4gZXZlbiByZWZlciB0byB2YXJpYWJsZXMgdGhhdCB3b3VsZCBv
dGhlcndpc2UgYmUgRFUgb3V0c2lkZSB0aGUgbG9vcCBib2R5OjwvcD48cD5gYGA8YnI+dm9pZCBt
KCkgezxicj4mbmJzcDsmbmJzcDsgaW50IGk7PGJyPiZuYnNwOyZuYnNwOyBmb3IgKGludCBqID0g
MCA7IGogJmx0OyAxMCA7IGogPSBqICsgaSkgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgaSA9IDE7IC8vIGlmIHRoaXMgaXMgY29tbWVudGVkIG91dCwgZXJyb3IhPGJyPiZuYnNw
OyZuYnNwOyB9PGJyPn08YnI+YGBgPGJyPjwvcD48cD5TbyBJJ20gbm90IHN1cmUgaXQgaXMmbmJz
cDsgYSBfc3RyaWN0XyBnZW5lcmFsaXphdGlvbiA6LSk8L3A+PHA+TWF1cml6aW88YnI+PC9wPjxi
bG9ja3F1b3RlIHR5cGU9ImNpdGUiIGNpdGU9Im1pZDpDQU5Tb0Z4dDU1VmZEMEhVZkorOFAzQUd4
QmR3YUxpaUtZVUhIamF5cFkzZm92M2dyUHdAbWFpbC5nbWFpbC5jb20iPjxkaXYgZGlyPSJsdHIi
PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2Pjxicj48L2Rpdj48ZGl2Pk5vdAogb25seSB0
aGF0LCBldmVuIHRob3VnaCBpdCdzIGJyb2FkZXIsIGl0J3MgYSBtdWNoIHNpbXBsZXIgcmVxdWly
ZW1lbnQgCnRoYXQgaGFzIG5vIGRlcGVuZGVuY2Ugb24gREEvRFUgYW5hbHlzaXMgb3IgYW55IGtp
bmQgb2YgZmxvdyBhbmFseXNpcy48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5TbwogSSdt
IHNheWluZyB0aGF0IHRoaXMgInNwYWNlIiBpbnRlcnByZXRhdGlvbiAtIHdoaWNoIGlzIHN0cmlj
dGx5IGxleGljYWwKIC0gaXMgc3VwZXJpb3IgYmVjYXVzZSBpdCBoYXMgYWxsIG9mIHRoZSBmb2xs
b3dpbmcgbmljZSBhdHRyaWJ1dGVzOjwvZGl2PjxkaXY+PHVsPjxsaT5JdCBzb2x2ZXMgdGhlIG9y
aWdpbmFsIHByb2JsZW0gLSBhbGxvdyBjYXB0dXJlIG9mIGJhc2ljIGZvcigpIGxvb3AgdmFyaWFi
bGVzIG11dGF0ZWQgb25seSBpbiB0aGUgbG9vcCBoZWFkZXI8L2xpPjxsaT5JdAogYWxzbyBzb2x2
ZXMgYSBtdWNoIHdpZGVyIHNldCBvZiAiZHVtbXkgdmFyaWFibGUiIGNhc2VzIGluIG90aGVyIGNv
ZGUgCihlLmcuLCBkbyBhbmQgd2hpbGUgbG9vcHMsIGFuZCBhbGwgYnV0IDUgb2YgdGhlIE1FVEhP
RFJFRiBleGFtcGxlcyBpbiAKdGhlIEpESyk8L2xpPjxsaT5ZZXQgaXQgc3RpbGwgc2VlbXMgdG8g
Y2xvc2VseSBtYXRjaCBkZXZlbG9wZXIgaW50dWl0aW9uCiAtIG9yIGF0IGxlYXN0LCBubyBsZXNz
IGNsb3NlbHkgdGhhbiB0aGUgcHJldmlvdXMgbW9yZSBsaW1pdGVkIGJhc2ljIApmb3IoKSBsb29w
IHByb3Bvc2FsIGRvZXM8YnI+PC9saT48bGk+SXQgaXMgdmVyeSBzaW1wbGUgdG8gc3BlY2lmeSBh
bmQgdW5kZXJzdGFuZDwvbGk+PC91bD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2PlRoZQogdXBzaG90
IGlzOiBJZiBvbmUgd2VyZSB0byBldmFsdWF0ZSBwb3NzaWJsZSByZXBsYWNlbWVudHMgZm9yIHRo
ZSAiZmluYWwKIG9yIGVmZmVjdGl2ZWx5IGZpbmFsIiByZXF1aXJlbWVudCBmb3IgdmFyaWFibGUg
Y2FwdHVyZSwgaW4gbXkgb3BpbmlvbiAKdGhpcyB3b3VsZCBiZSBhIHByb21pc2luZyBvcHRpb24g
LSBhbmQgaW4gcGFydGljdWxhciBoYXMgYSBtdWNoIGhpZ2hlciAKY29zdC9iZW5lZml0IHJhdGlv
IHRoYW4gdGhlIGVhcmxpZXIgcHJvcG9zYWwgb2YganVzdCBhZGRyZXNzaW5nIGJhc2ljIApmb3Io
KSBsb29wIHZhcmlhYmxlcy48YnI+PC9kaXY+PC9ibG9ja3F1b3RlPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>