<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <br>
    <blockquote type="cite" cite="mid:2006254717.16140758.1714491336502.JavaMail.zimbra@univ-eiffel.fr">
      <div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000">
        <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;"><font size="4" face="monospace"><br>
              So let's back up: what problem are we trying to solve
              here?</font></blockquote>
          <div><br data-mce-bogus="1">
          </div>
          <div>The problem is that the syntax of "with" does not show
            that with depends on the deconstructor and the constructor
            of the record, so the behavior in case of separate
            compilation is not clear.<br data-mce-bogus="1">
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    I think the lack of clarity you are concerned about is that the
    names of the components are being used as a new kind of API, where
    we lift API elements to variables, and you're concerned that those
    names are "weakly coupled" between declaration and client?  Is this
    right?<br>
    <br>
    <blockquote type="cite" cite="mid:2006254717.16140758.1714491336502.JavaMail.zimbra@univ-eiffel.fr">
      <div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000">
        <div data-marker="__QUOTED_TEXT__">
          <div>I see several ways to fix that:</div>
          <div>- restrict the uses of "with" to the package/module
            containing the record (as we have done with sealed types),</div>
        </div>
      </div>
    </blockquote>
    <br>
    With this restriction, I think the feature is not really useful
    enough to justify.  Plus this will annoy people.  <br>
    <br>
    <blockquote type="cite" cite="mid:2006254717.16140758.1714491336502.JavaMail.zimbra@univ-eiffel.fr">
      <div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000">
        <div data-marker="__QUOTED_TEXT__">
          <div>- allows a syntax variation where the components of the
            record are listed,</div>
        </div>
      </div>
    </blockquote>
    <br>
    So, this would be like a C++ lambda: <br>
    <br>
        // don't take the syntax seriously, purely meant to evoke C++
    lambda syntax<br>
        p = p with [x,y]{ x = 3; }<br>
    <br>
    and then the [x,y] would be used for the ctor/dtor lookup?<br>
    <br>
    <blockquote type="cite" cite="mid:2006254717.16140758.1714491336502.JavaMail.zimbra@univ-eiffel.fr">
      <div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000">
        <div data-marker="__QUOTED_TEXT__">
          <div>- link the canonical deconstructor/constructor of the
            record at runtime (which can be simpler if the local
            variable declared outside of the block are captured (like
            the variables inside a "when" expression)).</div>
        </div>
      </div>
    </blockquote>
    <br>
    Not sure what you mean here, but it probably doesn't scale to
    classes?<br>
    <br>
    <blockquote type="cite" cite="mid:2006254717.16140758.1714491336502.JavaMail.zimbra@univ-eiffel.fr">
      <div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000">
        <div data-marker="__QUOTED_TEXT__">
          <div>and maybe there are other solutions ?<br data-mce-bogus="1">
          </div>
          <div><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;"><br>
            <div class="moz-cite-prefix">On 4/30/2024 9:22 AM, Remi
              Forax wrote:<br>
            </div>
            <blockquote cite="mid:1211263117.16028569.1714483351732.JavaMail.zimbra@univ-eiffel.fr">
              <pre class="moz-quote-pre">Hello,
they have been several messages on amber-dev about the compatibility of the derived record creation.

I think part of the issue reported is that with the proposed syntax, the call to the desconstructor and the canonical constructor is implicit.

Let's take an example

  record Point(int x, int y) {}

  var point = new Point(2, 3);


In fact,
  var point2 = point with { x = y; };

is a shortcut for:

  var point2 = point with {
    Point(int x, int y) = this;  // i.e. int x = this.x(); int y = this.y();
    x = y;
    yield new Point(x, y);
  };

One problem with the current syntax is that because the call to the [de]constructors is implicit. I think we shoud allow users to write the implicit calls if they want.

I wonder if
- we should not allow yield to be used so the compiler adds yield automatically only if there is no yield ?
- we should in the future when deconstructors are introduced, allow users to call a deconstructor explicitly and only provide one if not explicitly written ?

Being able to write the calls explicitly is important because it's a way to detect if the record has been modified without the proper constructor/destructor has been written to be backward compatible (Like in a switch, a record pattern detects when a record component is added while a type pattern does not).

Being able to call a the deconstructor explicitly also have the advantage to avoid to declare a variable/calls the accessor if not needed.
By example
  var point2 = point with {
    Point(_, var y) = this;
    x = y;
  };

regards,
Rémi
</pre>
            </blockquote>
            <br>
            <br>
          </blockquote>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>