<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 08/05/2024 22:56, Konstantin Triger
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:CAGKqGxLtdnM7MXY4YcAMx-JiUb3C5J46Buq9ogTajTsa0gKVTA@mail.gmail.com">
      
      <div dir="ltr">
        <div dir="ltr">
          <div dir="ltr">
            <div dir="ltr">Hi Maurizio,
              <div><br>
              </div>
              <div>Looking on this, I'm wondering how important is this
                case: <span style="color:rgb(51,51,51);font-family:Consolas,Inconsolata,Courier,monospace;font-size:11.05px;background-color:rgb(248,248,248)">Quoted<Function<?,
                  ?>> f = (Integer i) -> </span><span style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:11.05px;color:rgb(221,17,68)">""</span><span style="color:rgb(51,51,51);font-family:Consolas,Inconsolata,Courier,monospace;font-size:11.05px;background-color:rgb(248,248,248)">;</span></div>
              <div>The "practical" case is something like: <T, R>
                RETURN_TYPE method(Quoted<Function<T, R>>
                f).</div>
              <div>Which should compile well because of inference.</div>
              <div>And if someone insists on working with wildcards, so
                he has an option.</div>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <p>The specific case per se is not important. But if Babylon needs
      more help from the language, I think whatever feature we add needs
      to slot it correctly into the existing type system/inference
      machinery. The Quoted<T> idea at the moment seems more a
      case of a square peg in a round hole - but that's not to say that,
      maybe, we'll come up with some clever idea to rescue that
      approach.</p>
    <p>Maurizio<br>
    </p>
    <blockquote type="cite" cite="mid:CAGKqGxLtdnM7MXY4YcAMx-JiUb3C5J46Buq9ogTajTsa0gKVTA@mail.gmail.com">
      <div dir="ltr">
        <div dir="ltr">
          <div dir="ltr">
            <div dir="ltr">
              <div><br>
              </div>
              <div>Kosta</div>
            </div>
          </div>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Wed, May 8, 2024 at 3:19 PM
          Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">maurizio.cimadamore@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>
            <div>
              <p style="margin:0px 0px 1.2em">On 06/05/2024 18:50, Paul
                Sandoz wrote:</p>
              <div>
                <blockquote type="cite">
                  <pre><blockquote type="cite" style="color:rgb(140,140,140)"><pre>Just wanted to mention that there might be alternative implementations addressing this requirement.
1. Structural quoting (a la C#) - derives from the variable type, e.g. Quoted<T>. So, the user understands that the lambda body will be accessible.
</pre></blockquote><pre>There are some challenges with Java’s type system, which is why we embedded up where we are with the current approaches. Maurizio is better able than I to describe these challenges.</pre></pre>
                </blockquote>
              </div>
              <p style="margin:0px 0px 1.2em">Hi,<br>
                we have explored approaches such as <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">Quoted<T></code>
                (where <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">T</code>
                is a functional interface) early on. And found them a
                bad fit for Java. The main issue we faced is that being
                a functional interface, as per today’s JLS, is a
                predicate on class declarations not types (there was
                some intense discussion on this point during Java 8).
                But here we have something that can be treated as a
                functional interface or not, precisely depending on its
                type (e.g. the type parameter). E.g. a <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">Quotable<T></code>
                is a functional interface or not depending on <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">T</code>.
                This is a pretty deep big departure from how the spec
                currently deal with functional interfaces.</p>
              <p style="margin:0px 0px 1.2em">One possibility would be
                for the compiler/spec to ignore the <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">Quoted<T></code>,
                and just focus on the inner <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">T</code>,
                and then add the quoting back, after type-checking. But
                doing so leads to (bad) edge cases. For instance, Java 8
                supports a form of inference of the target type from the
                explicit lambda parameter types, in this case:</p>
              <pre style="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;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248);display:block">Function<?, ?> f = (Integer i) -> <span style="color:rgb(221,17,68)">""</span>;
</code></pre>
              <p style="margin:0px 0px 1.2em">In this case, the type of
                the lambda expression is not just <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">Function<?, ?></code>
                (the target type), but <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">Function<Integer,Object></code>.
                That is, the compiler tries to get rid of the wildcards
                before attempting to type-check the lambda expression
                (this step is performed to avoid wildcards popping up
                when checking the lambda body). But with quoting, this
                won’t compose well - e.g.:</p>
              <pre style="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;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248);display:block">Quoted<Function<?, ?>> f = (Integer i) -> <span style="color:rgb(221,17,68)">""</span>;
</code></pre>
              <p style="margin:0px 0px 1.2em">Will give an error:</p>
              <pre style="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;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">error: incompatible types: Quoted<Function<Integer, Object>> cannot be converted to Quoted<Function<?, ?>>
 Quoted<Function<?, ?>> f = (Integer i) -> “”; 
                                             ^
</code></pre>
              <p style="margin:0px 0px 1.2em">That is, the functional
                interface type inferred by the compiler (by dropping
                wildcards) is now incompatible with the target type
                (because of the way in which generics type-argument
                containment rules work). To make things work, the client
                would need at least to do this:</p>
              <pre style="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;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">Quoted<? extends Function<?, ?>> f = (Integer i) -> “”;
</code></pre>
              <p style="margin:0px 0px 1.2em">Overall it felt like we
                were pushing against the physics of the language here.
                Serializable lambdas (with all their limitations) were a
                strong precedent to build on top of, which didn’t suffer
                from any of the limitations described above.</p>
              <p style="margin:0px 0px 1.2em">Maurizio​</p>
              <div title="MDH:PGRpdiBjbGFzcz0ibWFya2Rvd24taGVyZS13cmFwcGVyIiBkYXRhLW1kLXVybD0iIiBzdHlsZT0i
IiBtYXJrZG93bi1oZXJlLXdyYXBwZXItY29udGVudC1tb2RpZmllZD0idHJ1ZSI+PHAgc3R5bGU9
Im1hcmdpbjogMHB4IDBweCAxLjJlbSAhaW1wb3J0YW50OyI+T24gMDYvMDUvMjAyNCAxODo1MCwg
UGF1bCBTYW5kb3ogd3JvdGU6PC9wPgo8cCBzdHlsZT0ibWFyZ2luOiAwcHggMHB4IDEuMmVtICFp
bXBvcnRhbnQ7Ij48L3A+PGRpdiBjbGFzcz0ibWFya2Rvd24taGVyZS1leGNsdWRlIj48cD48L3A+
PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOkU0QjVDRDJGLTNBM0UtNDhGQS05NkY2
LTBGNzREMURGMjMyMkBvcmFjbGUuY29tIj48cHJlPjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiIHN0
eWxlPSJjb2xvcjogIzhjOGM4YzsiPjxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+
SnVzdCB3YW50ZWQgdG8gbWVudGlvbiB0aGF0IHRoZXJlIG1pZ2h0IGJlIGFsdGVybmF0aXZlIGlt
cGxlbWVudGF0aW9ucyBhZGRyZXNzaW5nIHRoaXMgcmVxdWlyZW1lbnQuCjEuIFN0cnVjdHVyYWwg
cXVvdGluZyAoYSBsYSBDIykgLSBkZXJpdmVzIGZyb20gdGhlIHZhcmlhYmxlIHR5cGUsIGUuZy4g
UXVvdGVkJmx0O1QmZ3Q7LiBTbywgdGhlIHVzZXIgdW5kZXJzdGFuZHMgdGhhdCB0aGUgbGFtYmRh
IGJvZHkgd2lsbCBiZSBhY2Nlc3NpYmxlLgo8L3ByZT48L2Jsb2NrcXVvdGU+PHByZSBjbGFzcz0i
bW96LXF1b3RlLXByZSIgd3JhcD0iIj5UaGVyZSBhcmUgc29tZSBjaGFsbGVuZ2VzIHdpdGggSmF2
YeKAmXMgdHlwZSBzeXN0ZW0sIHdoaWNoIGlzIHdoeSB3ZSBlbWJlZGRlZCB1cCB3aGVyZSB3ZSBh
cmUgd2l0aCB0aGUgY3VycmVudCBhcHByb2FjaGVzLiBNYXVyaXppbyBpcyBiZXR0ZXIgYWJsZSB0
aGFuIEkgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbGxlbmdlcy48L3ByZT48L3ByZT48L2Jsb2NrcXVv
dGU+PHA+PC9wPjwvZGl2PjxwIHN0eWxlPSJtYXJnaW46IDBweCAwcHggMS4yZW0gIWltcG9ydGFu
dDsiPjwvcD5IaSw8YnI+d2UgaGF2ZSBleHBsb3JlZCBhcHByb2FjaGVzIHN1Y2ggYXMgYFF1b3Rl
ZCZsdDtUJmd0O2AgKHdoZXJlIGBUYCBpcyBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlKSBlYXJseSBv
bi4gQW5kIGZvdW5kIHRoZW0gYSBiYWQgZml0IGZvciBKYXZhLiBUaGUgbWFpbiBpc3N1ZSB3ZSBm
YWNlZCBpcyB0aGF0IGJlaW5nIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UsIGFzIHBlciB0b2RheeKA
mXMgSkxTLCBpcyBhIHByZWRpY2F0ZSBvbiBjbGFzcyBkZWNsYXJhdGlvbnMgbm90IHR5cGVzICh0
aGVyZSB3YXMgc29tZSBpbnRlbnNlIGRpc2N1c3Npb24gb24gdGhpcyBwb2ludCBkdXJpbmcgSmF2
YSA4KS4gQnV0IGhlcmUgd2UgaGF2ZSBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdHJlYXRlZCBhcyBh
IGZ1bmN0aW9uYWwgaW50ZXJmYWNlIG9yIG5vdCwgcHJlY2lzZWx5IGRlcGVuZGluZyBvbiBpdHMg
dHlwZSAoZS5nLiB0aGUgdHlwZSBwYXJhbWV0ZXIpLiBFLmcuIGEgYFF1b3RhYmxlJmx0O1QmZ3Q7
YCBpcyBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIG9yIG5vdCBkZXBlbmRpbmcgb24gYFRgLiBUaGlz
IGlzIGEgcHJldHR5IGRlZXAgYmlnIGRlcGFydHVyZSBmcm9tIGhvdyB0aGUgc3BlYyBjdXJyZW50
bHkgZGVhbCB3aXRoIGZ1bmN0aW9uYWwgaW50ZXJmYWNlcy48YnI+PGJyPk9uZSBwb3NzaWJpbGl0
eSB3b3VsZCBiZSBmb3IgdGhlIGNvbXBpbGVyL3NwZWMgdG8gaWdub3JlIHRoZSBgUXVvdGVkJmx0
O1QmZ3Q7YCwgYW5kIGp1c3QgZm9jdXMgb24gdGhlIGlubmVyIGBUYCwgYW5kIHRoZW4gYWRkIHRo
ZSBxdW90aW5nIGJhY2ssIGFmdGVyIHR5cGUtY2hlY2tpbmcuIEJ1dCBkb2luZyBzbyBsZWFkcyB0
byAoYmFkKSBlZGdlIGNhc2VzLiBGb3IgaW5zdGFuY2UsIEphdmEgOCBzdXBwb3J0cyBhIGZvcm0g
b2YgaW5mZXJlbmNlIG9mIHRoZSB0YXJnZXQgdHlwZSBmcm9tIHRoZSBleHBsaWNpdCBsYW1iZGEg
cGFyYW1ldGVyIHR5cGVzLCBpbiB0aGlzIGNhc2U6PGJyPjxicj5gYGBqYXZhPGJyPkZ1bmN0aW9u
Jmx0Oz8sID8mZ3Q7IGYgPSAoSW50ZWdlciBpKSAtJmd0OyAiIjs8YnI+YGBgPGJyPjxicj5JbiB0
aGlzIGNhc2UsIHRoZSB0eXBlIG9mIHRoZSBsYW1iZGEgZXhwcmVzc2lvbiBpcyBub3QganVzdCBg
RnVuY3Rpb24mbHQ7PywgPyZndDtgICh0aGUgdGFyZ2V0IHR5cGUpLCBidXQgYEZ1bmN0aW9uJmx0
O0ludGVnZXIsT2JqZWN0Jmd0O2AuIFRoYXQgaXMsIHRoZSBjb21waWxlciB0cmllcyB0byBnZXQg
cmlkIG9mIHRoZSB3aWxkY2FyZHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdHlwZS1jaGVjayB0aGUg
bGFtYmRhIGV4cHJlc3Npb24gKHRoaXMgc3RlcCBpcyBwZXJmb3JtZWQgdG8gYXZvaWQgd2lsZGNh
cmRzIHBvcHBpbmcgdXAgd2hlbiBjaGVja2luZyB0aGUgbGFtYmRhIGJvZHkpLiBCdXQgd2l0aCBx
dW90aW5nLCB0aGlzIHdvbuKAmXQgY29tcG9zZSB3ZWxsIC0gZS5nLjo8YnI+PGJyPmBgYGphdmE8
YnI+UXVvdGVkJmx0O0Z1bmN0aW9uJmx0Oz8sID8mZ3Q7Jmd0OyBmID0gKEludGVnZXIgaSkgLSZn
dDsgIiI7PGJyPmBgYDxicj48YnI+V2lsbCBnaXZlIGFuIGVycm9yOjxicj48YnI+YGBgPGJyPmVy
cm9yOiBpbmNvbXBhdGlibGUgdHlwZXM6IFF1b3RlZCZsdDtGdW5jdGlvbiZsdDtJbnRlZ2VyLCBP
YmplY3QmZ3Q7Jmd0OyBjYW5ub3QgYmUgY29udmVydGVkIHRvIFF1b3RlZCZsdDtGdW5jdGlvbiZs
dDs/LCA/Jmd0OyZndDs8YnI+IFF1b3RlZCZsdDtGdW5jdGlvbiZsdDs/LCA/Jmd0OyZndDsgZiA9
IChJbnRlZ2VyIGkpIC0mZ3Q7IOKAnOKAnTsgPGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgXjxicj5gYGA8YnI+
PGJyPlRoYXQgaXMsIHRoZSBmdW5jdGlvbmFsIGludGVyZmFjZSB0eXBlIGluZmVycmVkIGJ5IHRo
ZSBjb21waWxlciAoYnkgZHJvcHBpbmcgd2lsZGNhcmRzKSBpcyBub3cgaW5jb21wYXRpYmxlIHdp
dGggdGhlIHRhcmdldCB0eXBlLiBUbyBtYWtlIHRoaW5ncyB3b3JrLCB0aGUgY2xpZW50IHdvdWxk
IG5lZWQgYXQgbGVhc3QgdG8gZG8gdGhpczo8YnI+PGJyPmBgYDxicj5RdW90ZWQmbHQ7PyBleHRl
bmRzIEZ1bmN0aW9uJmx0Oz8sID8mZ3Q7Jmd0OyBmID0gKEludGVnZXIgaSkgLSZndDsg4oCc4oCd
Ozxicj5gYGA8YnI+PGJyPk92ZXJhbGwgaXQgZmVsdCBsaWtlIHdlIHdlcmUgcHVzaGluZyBhZ2Fp
bnN0IHRoZSBwaHlzaWNzIG9mIHRoZSBsYW5ndWFnZSBoZXJlLiBTZXJpYWxpemFibGUgbGFtYmRh
cyAod2l0aCBhbGwgdGhlaXIgbGltaXRhdGlvbnMpIHdlcmUgYSBzdHJvbmcgcHJlY2VkZW50IHRv
IGJ1aWxkIG9uIHRvcCBvZiwgd2hpY2ggZGlkbuKAmXQgc3VmZmVyIGZyb20gYW55IG9mIHRoZSBs
aW1pdGF0aW9ucyBkZXNjcmliZWQgYWJvdmUuPGJyPuKAizxicj48L2Rpdj4=" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px">​</div>
            </div>
          </div>
        </blockquote>
      </div>
      <br clear="all">
      <div><br>
      </div>
      <span class="gmail_signature_prefix">-- </span><br>
      <div dir="ltr" class="gmail_signature">
        <div dir="ltr">Regards,<br>
          Konstantin Triger<br>
        </div>
      </div>
    </blockquote>
  </body>
</html>