<div dir="ltr"><div dir="ltr"></div><div>Might be off-topic for the mailing list but I thought I would share since it is on topic for the thread.</div><div><br></div><div>Remi - you might like my library: <a href="https://easytuples.github.io/easy-tuples/">https://easytuples.github.io/easy-tuples/</a></div><div dir="ltr"><br></div><div>It is intended to provide as close to "structural" tuples as I think are possible in Java right now.<br></div><div dir="ltr"><br></div><div>On a previous thread it was stated that the in-place destructuring will come (nominal de-structuring of course not structural) but is lower priority.</div><div>See: <a href="https://mail.openjdk.org/pipermail/amber-dev/2024-December/009105.html">https://mail.openjdk.org/pipermail/amber-dev/2024-December/009105.html</a></div><div><br></div><div>Your example:</div><div><br></div><div>
(int min, int max) minmax(int a, int b) { <br>
return (Math.min(a, b), Math.max(a, b)); <br>
} <br>
<br>
void main() { <br>
var (min, max) = minmax(7, 3); <br>
// or <br>
var result = minmax(...(7, 3)); // with a spread operator <br>


</div><div><br></div><div>Could eventually become:</div><div><br></div><div>_2<Integer, Integer> minmax(int a, int b) {</div><div>     return _2.of(Math.min(a,b), Math.max(a,b));</div><div>}</div><div><br></div><div>void main() {</div><div>    _2(var min, var max) pair = minmax(7,3);  <br></div><div>}<br></div><div><br></div><div>
 (the _2 type is my 'structural' pair tuple in the library I mentioned above) <br></div><div><br></div><div><div>Regards,</div><div>Vikram<br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Dec 10, 2024 at 10:01 AM <<a href="mailto:amber-dev-request@openjdk.org">amber-dev-request@openjdk.org</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"><br>
   2. Re: Constructing records through reflection and module<br>
      restrictions (<a href="mailto:forax@univ-mlv.fr" target="_blank">forax@univ-mlv.fr</a>)<br>
<br>
<br><br>
Message: 2<br>
Date: Tue, 10 Dec 2024 11:00:57 +0100 (CET)<br>
From: <a href="mailto:forax@univ-mlv.fr" target="_blank">forax@univ-mlv.fr</a><br>
To: Ryan Leach <<a href="mailto:rleach@rleach.id.au" target="_blank">rleach@rleach.id.au</a>>, Ethan McCue <<a href="mailto:ethan@mccue.dev" target="_blank">ethan@mccue.dev</a>><br>
Cc: amber-dev <<a href="mailto:amber-dev@openjdk.org" target="_blank">amber-dev@openjdk.org</a>><br>
Subject: Re: Constructing records through reflection and module<br>
        restrictions<br>
Message-ID:<br>
        <<a href="mailto:1055813512.18413861.1733824857389.JavaMail.zimbra@univ-eiffel.fr" target="_blank">1055813512.18413861.1733824857389.JavaMail.zimbra@univ-eiffel.fr</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
> From: "Ethan McCue" <<a href="mailto:ethan@mccue.dev" target="_blank">ethan@mccue.dev</a>><br>
<br>
> I'd wager the feature being missed in those cases is in-place destructing, less<br>
> so anonymous components.<br>
<br>
> From: "Ryan Leach" <<a href="mailto:rleach@rleach.id.au" target="_blank">rleach@rleach.id.au</a>><br>
<br>
> The way I've seen records adopted and used, seem pretty far removed from Tuples,<br>
> so don't really understand why you are in support of making them more<br>
> Tuple-like Remi. I suspect we'll see true Tuples being introduced long before<br>
> records are considered to be turned into Tuples. Not that I suspect that's<br>
> particularly likely.<br>
<br>
yes, i'm not arguying that records should be tuples, only that for a lot of my students, they see tuples are a building block and Java is missing that. <br>
<br>
As Ethan said, in-place structuring/destructing is another name for tuples (with named components). <br>
<br>
By examples: <br>
(int min, int max) minmax(int a, int b) { <br>
return (Math.min(a, b), Math.max(a, b)); <br>
} <br>
<br>
void main() { <br>
var (min, max) = minmax(7, 3); <br>
// or <br>
var result = minmax(...(7, 3)); // with a spread operator <br>
} <br>
<br>
As Brian said, the main issue here is that those things are structural typed, not nominally typed. <br>
<br>
R?mi <br>
<br>
> On Mon, 9 Dec 2024, 3:07 am Remi Forax, < [ mailto:<a href="mailto:forax@univ-mlv.fr" target="_blank">forax@univ-mlv.fr</a> |<br>
> <a href="mailto:forax@univ-mlv.fr" target="_blank">forax@univ-mlv.fr</a> ] > wrote:<br>
<br>
>>> From: "Brian Goetz" < [ mailto:<a href="mailto:brian.goetz@oracle.com" target="_blank">brian.goetz@oracle.com</a> | <a href="mailto:brian.goetz@oracle.com" target="_blank">brian.goetz@oracle.com</a> ]<br>
>>> ><br>
>>> To: "Florian Weimer" < [ mailto:<a href="mailto:fw@deneb.enyo.de" target="_blank">fw@deneb.enyo.de</a> | <a href="mailto:fw@deneb.enyo.de" target="_blank">fw@deneb.enyo.de</a> ] ><br>
>>> Cc: "amber-dev" < [ mailto:<a href="mailto:amber-dev@openjdk.org" target="_blank">amber-dev@openjdk.org</a> | <a href="mailto:amber-dev@openjdk.org" target="_blank">amber-dev@openjdk.org</a> ] ><br>
>>> Sent: Sunday, December 8, 2024 4:50:43 PM<br>
>>> Subject: Re: Constructing records through reflection and module restrictions<br>
<br>
>>> Sure, there are other ways we could have designed the language. Tuples are<br>
>>> structural types, which means they are not declared, but instead spring when<br>
>>> the type constructor is applied to other (necessarily accessible) types. This<br>
>>> means there is no need for access control, since anyone who can access T and U<br>
>>> can "summon" the type `tuple<T,U>`. (We have this for arrays already -- which<br>
>>> is already a significant source of irregularity in the language, so we chose<br>
>>> not to emulate that.)<br>
<br>
>>> But, we chose to lean into Java's class-based, nominal type system. Making<br>
>>> special exceptions "because it's like a tuple" is surely convenience in some<br>
>>> cases, but makes the language more complicated to reason about overall.<br>
>> We have made an exception for lambdas.<br>
<br>
>> There is something special with tuples, most of my students now learn<br>
>> programming with Python as first langage, so there are used to use tuples as an<br>
>> element of design.<br>
>> As an example, when students start Java, we have a course to explain that Java<br>
>> has no tuples and the difference between a record and a tuple.<br>
<br>
>> Another example, currently, this is the time of the year where we are doing the<br>
>> advent of code, students can choose the langage they want, most of the<br>
>> undergraduate students choose Python.<br>
>> When asked why, having tuples is the most cited feature, and it makes sense<br>
>> given the kind of problems of the advent of code.<br>
<br>
>> I think we will have to fix this in Java at some point, not now, perhaps even<br>
>> not us, but exactly like we did not need lambdas because we had inner classes,<br>
>> not having tuples will be seen increasingly as a Java problem.<br>
<br>
>> regards,<br>
>> R?mi<br>
<br>
>> NB: For graduate students, most of them are using Java for the advent of code,<br>
>> but i suppose this is a kind of Stockholm syndrome reaction because they are<br>
>> using Java in most of their courses (concurrency, android, http server, design<br>
>> pattern, spring, etc).<br>
<br>
>>> On 12/8/2024 10:15 AM, Florian Weimer wrote:<br>
<br>
>>>> It's the syntactic overhead.  The attractiveness of this pattern is<br>
>>>> that's it's a clear and concise notation for this type of<br>
>>>> deserialization.  Creating a public type for it in a suitable package<br>
>>>> sort of breaks that.<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="https://mail.openjdk.org/pipermail/amber-dev/attachments/20241210/bf0ddbb3/attachment.htm" rel="noreferrer" target="_blank">https://mail.openjdk.org/pipermail/amber-dev/attachments/20241210/bf0ddbb3/attachment.htm</a>><br>
<br>
End of amber-dev Digest, Vol 94, Issue 15<br>
*****************************************<br>
</blockquote></div></div></div>