<div dir="ltr"><div class="gmail_default" style="font-family:monospace">Apologies for the incorrect cross post.</div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">I see what you mean.</div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">The value that I saw was if Thingie from your example had an alternative deconstructor that only outputted a and b. That way, the default is the given deconstructor, but you can opt into using a separate deconstruction pattern (deconstructor, static pattern, or instance pattern) instead of the default. <br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 18, 2023 at 8:23 PM Brian Goetz <<a href="mailto:brian.goetz@oracle.com" target="_blank">brian.goetz@oracle.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

  
  <div>
    <font size="4"><font face="monospace">(cross-posting to -comments is
        discouraged)<br>
        <br>
        If we are reconstructing something as trivial as a Point, we
        might not even use a reconstruction expression, since an
        ordinary constructor invocation is probably good enough (it only
        has two components, and we're changing at least one of them.)  <br>
        <br>
        Now imagine you are reconstructing something with a dozen
        components, which is where reconstruction expressions offer more
        value.  I don't think people would be very happy with a syntax
        like<br>
        <br>
            thingie with Thingie(var a, var b, var c, var d, var e, <br>
                                 var f, var g, var h, var i, var j) { a
        = 3 }<br>
        <br>
        <br>
      </font></font><br>
    <div>On 10/18/2023 8:01 PM, David Alayachew
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div class="gmail_default" style="font-family:monospace">Also
          adding <a class="gmail_plusreply" id="m_-7021399447459384931m_-625894589435279725plusReplyChip-1" href="mailto:amber-dev@openjdk.org" target="_blank">@amber-dev</a> <br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Wed, Oct 18, 2023 at
          8:00 PM David Alayachew <<a href="mailto:davidalayachew@gmail.com" target="_blank">davidalayachew@gmail.com</a>>
          wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div dir="ltr">
            <div class="gmail_default" style="font-family:monospace">Adding
              -comments<br>
            </div>
          </div>
          <br>
          <div class="gmail_quote">
            <div dir="ltr" class="gmail_attr">On Sat, Sep 23, 2023 at
              10:54 AM Attila Kelemen <<a href="mailto:attila.kelemen85@gmail.com" target="_blank">attila.kelemen85@gmail.com</a>>
              wrote:<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
              <div dir="ltr">Note: I think you would have a better
                chance, if you sent the email to "amber-spec-comments"
                than "observers", since the people who can actually make
                changes are more likely to read the "comments" list.
                <div><br>
                </div>
                <div>That said, I don't really see the usefulness of
                  such a syntax (and adding new syntax in itself is a
                  detriment). That is, if I understood you correctly,
                  then your example would replace this:</div>
                <div><br>
                </div>
                <div>```</div>
                <div>Point p = ...;<br>
                  Point pp = new Point(p.x() + 2, 0);<br>
                </div>
                <div>```</div>
                <div><br>
                </div>
                <div>which is shorter and a lot more obvious. And if we
                  were to go to more complicated things (many
                  properties), then it doesn't help that much, because
                  as far as I understand you, your proposal is still
                  positional in its deconstruction pattern, and the
                  positional nature is usually what is awkward in
                  structures with many properties.</div>
                <div><br>
                </div>
              </div>
              <br>
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">Harrison Chikwe <<a href="mailto:nhcdeveloper@gmail.com" target="_blank">nhcdeveloper@gmail.com</a>>
                  ezt írta (időpont: 2023. szept. 23., Szo, 12:01):<br>
                </div>
                <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                  <div dir="ltr">
                    <div>Hi,</div>
                    <div><br>
                    </div>
                    <div>I think that it is very useful to have when
                      working with immutable objects.</div>
                    <br>
                    For the purposes of this mail, let's call the design
                    described in the ambro-doc[1]:<br>
                    reconstruction expression with implicit
                    deconstructor (aka REWID).<br>
                    <br>
                    Has it been considered to make the deconstructor
                    pattern explicit in the reconstruction<br>
                    expression (aka REWED)?<br>
                    Doing so may remove the requirement to make names
                    more significant in the language.<br>
                    <br>
                    For example, given the following:<br>
                    <br>
                    Point p = ...;<br>
                    Point pp = p with(int x, int y) { x += 2; y = 0; }<br>
                    <br>
                    We can interpret the reconstruction expression above
                    as:<br>
                    <br>
                    . Find a deconstructor and constructor pair that has
                    a signature that matches (int, int)<br>
                    . Deconstruct the target with the deconstructor<br>
                    . Execute the block on RHS<br>
                    . Invoke the constructor with the result.<br>
                    <br>
                    If we split the reconstruction expression into three
                    steps:<br>
                    <br>
                    1. Extraction<br>
                    2. Transformation<br>
                    3. Construction<br>
                    <br>
                    In REWID users are required only to do step 2
                    (transformation) and the<br>
                    system handles 1 and 3. Whereas in REWED users are
                    required to do step 1 and 2<br>
                    and the system handles just step 3.<br>
                    <br>
                    # Other forms of REWED<br>
                    <br>
                    1. Explicit Named deconstructor pattern<br>
                       <br>
                       Point pp = p with Point(int x, int y) {...}<br>
                    <br>
                    2. Explicit Var deconstructor pattern<br>
                    <br>
                       Point pp = p with var(int x, int y) {...}<br>
                    <br>
                    3. Explicit Unnamed deconstructor pattern<br>
                       <br>
                       Point pp = p with(int x, int y) {...}<br>
                    <br>
                    <br>
                    We can extend form 1 to include factory pattern:<br>
                    <br>
                       Point pp = p with Point.factory(int x, int y)
                    {...}<br>
                    <br>
                    <br>
                    # Advantages<br>
                    <br>
                    1. No need to make names significant.<br>
                    2. Can be combined with other patterns (e.g. unnamed
                    pattern, var pattern)<br>
                    <br>
                       Point pp = p with(int x, _) { x = 0; }<br>
                    <br>
                    <br>
                    Nyehamene.</div>
                </blockquote>
              </div>
            </blockquote>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </div>

</blockquote></div>