A peek at the roadmap for pattern matching and more

forax at univ-mlv.fr forax at univ-mlv.fr
Thu Aug 13 20:22:34 UTC 2020


> 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 


More information about the amber-spec-observers mailing list