A peek at the roadmap for pattern matching and more

Brian Goetz brian.goetz at oracle.com
Thu Aug 13 20:28:52 UTC 2020


This was meant to be a sneak peek, for context, not an invitation to 
argue about the syntax.  Was it a mistake to share it at this time?

(And remember the rule: don't comment on syntax until you've said 
everything you have to say about the model, because otherwise nothing 
else will ever get said.  So shall I assume you think the model is perfect?)





On 8/13/2020 4:22 PM, forax at univ-mlv.fr wrote:
>
>
> ------------------------------------------------------------------------
>
>     *De: *"Brian Goetz" <brian.goetz at oracle.com>
>     *À: *"Remi Forax" <forax at univ-mlv.fr>
>     *Cc: *"amber-spec-experts" <amber-spec-experts at openjdk.java.net>
>     *Envoyé: *Jeudi 13 Août 2020 15:42:40
>     *Objet: *Re: A peek at the roadmap for pattern matching and more
>
>         We want a destructor, a destructor is a method that returns a
>         list of values the same way a constructor takes a list of
>         parameters.
>         The way to represent that list of value is to use a record.
>
>
>     Yes, already been down that road, I did an entire sketch of this
>     feature where we expose “anonymous records.”  It felt really cool
>     — for about five minutes.  The conclusion of this exercise was
>     that in this case, records are better as a _translation mechanism_
>     than a surface syntax.
>
>
> first why ? and second, my experience is the opposite, the more there 
> is a difference between Java the language and the translation strategy 
> the more it will bite you with corner cases.
>
>      So yes, the way to represent it is a record, but in the class
>     file, not the language.
>
>         So we can already write a de-constructor with the current
>         version of Java,
>
>
>     As you figured out, if you cast a deconstructor as a method with a
>     special name, you say goodbye to deconstructor overloading.   And
>     if you do make it magically overloadable, then it's magic,
>
>
> It's not magic, it's a translation strategy like the same way with 
> bridges, you can have methods with the same name and different return 
> types.
>
>     and you’ve lost all the benefit off pretending its a method.  You
>     just moved the complexity around.  And again here comes that glass
>     half empty feeling: “Why can I only do it with this method?”. Much
>     better to recognize that deconstruction is a fundamental operation
>     on objects, just like construction — because it is.
>
>
> But constructors are plain methods with some special bells and 
> whistles (funny names, funny rules for the initialization of this and 
> final fields, etc).
> Having a deconstructor being a method with several overloads doesn't 
> strike me as very magic compared to a constructor.
>
> And you can not have several overloaded methods with different return 
> types because Java like C doesn't force you to specify the return type 
> of a method call. So unlike with a pattern where you provide the type, 
> you don't provide the return type when you do a method call.
>
>
>         i should wuth by example a method minMax that returns both the
>         minimum and the maximum of an array
>
>           public static (int min, int max) minMax(int[] array) {
>
>
>     Nope.  Not going there.  I went down this road too, but
>     multiple-return is another one of those “tease” features that
>     looks cool but very quickly looks like glass 80% empty.  More fake
>     tuples for which the user will not thank us.  And, to the extent
>     we pick _this particular_ tuple syntax, the reaction is “well then
>     WTF did you do records for?”
>
>
> Records are the underlying type used by the tuple syntax.
> The tuple syntax is as its name suggest, just a syntax. From the 
> semantics POV, it's an anonymous record, thus, not a structural type.
>
> You may use a record instead of an anonymous record, if you want to 
> reuse the same record for multiple deconstructor, if i have several 
> classes representing rectangular shape, i may want them to share the 
> same record.
> It's really very similar to the difference between a method reference 
> and a lambda or a classical class and an anonymous class. A record is 
> explicitly named, it can have annotations, it can be serializable, 
> implements interfaces, have it's own toString() etc. An anonymous 
> record is the anonymous version of a record, where you don't care 
> about the name or resource sharing (on record per deconstructor).
>
>      Having records _and_ structural tuples would be silly.  We’ve
>     made our choice: Java’s tuples are nominal.
>
>
> But the syntax you are proposing for deconstruction is using the 
> syntax of a _structural tuples_ . Here the glass is half empty, 
> because why the deconstructor can have that feature and not any 
> methods given that at the end a de-constructor is desugared as a 
> method that return a record. As i said in my original mail. I agree 
> with you that we don't want a _structural tuples_, but it's not, it's 
> an anonymous record and restricted them only to deconstructor does not 
> make make a lot of sens.
> I's like saying look this shinny anonymous record, deconstructor can 
> use them but not regular methods.
>
>
>     Worse, it only addresses the simplest of patterns — deconstructors
>     — because they are inherently total.  When you get to conditional
>     patterns (Optional.of(var x)), you want to wrap that record in
>     something like an optional.  If the return value is fake, now you
>     have to deal with the interaction of trade tuples and generics.
>      No thank you.
>
>
> I don't see the issue here, where is the problem with the following code ?
>   Optional<(int x, int y)> deconstructor() {
>     return Optional.of( (this.x, this.y) );
>   }
>
> Maybe users will find the syntax weird ? But it's like any new feature ?
> I believe you are thinking that the type (int x, int y) is a tuple 
> while technically it's an anonymous record, so from the type system 
> POV it acts as a record, i.e. a nominal class.
>
>
>     Believe me, I’ve been down ALL of these roads.
>
>         the compiler will generate a synthetic record, so the
>         generated code is equivalent to
>
>
>     The synthetic record part is the part I liked, and kept.
>     There’s room for an “anonymous tuple” feature someday, maybe, but
>     we don’t need it now.
>
>
> I'm not suggesting to introduce an anonymous tuple, as you said above, 
> we have decided to use record instead, a nominal type.
> I'm suggesting to introduce the concept of anonymous record, which is 
> what the synthetic record is, because i see no point to restrict it 
> only to deconstructors.
>
>
>     I’m willing to consider the “record conversion” when we get to
>     collection literals, but not now.
>
>
> To represent the couple key/value i suppose.
> I don't disagree, but i don't think it's wise to introduce the idea of 
> a synthetic record without the notion of anonymous record, but we 
> don't need a synthetic record for deconstructors, it's nice to have 
> but not an essential part of the design.
>
> Rémi
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20200813/d703a601/attachment-0001.htm>


More information about the amber-spec-experts mailing list