On 08.03.2018 20:52, Remi Forax wrote:
[...]
using break here is ugly, i agree with you but we (the amber EG) are not able
to find a better solution,
if you know a better way to handle local return of a value in the case of a
switch, please help us.
should inspiration strike me I will let you guys know ;)
[...]
no, the Java part of the pattern matching is mostly decided (there is still
corner cases like how re-starting when a guard fails).
The pattern matching is delayed more because
1/ the VM support is not there, part will be in the jdk 11, but how to specify
a sealed interface to avoid to have to specify a default when you have cover
all the cases is still open.
2/ the support of de-constructor (extractor) to keep encapsulation without
allocation in the middle of the pattern matching requires:
2a/ value types, good progress have been made on the valhalla side, a
release of value types without changing generics (which is a major PITA) may be
a temporary solution.
2b/ another temporary solution is to make pattern matching only working on
records (data classes).
The only part of the pattern matching which is ugly IMO is how to specify a "local return" of a value in a case with several instructions.
I really do not want to sound like a broken record, but I really think
the local return problem is no problem with the lambda version. Its
limitations are already accepted there. Of course it is unfair to jump
in with a comment like that, without taking the time to see what was
worked out and why before.
As for the deconstructor... yes I was really curious about how that
problem is going to be solved.
Now, releasing an expression switch first has several advantages:
- allow to align the old switch with the pattern matching switch by modernizing
the behavior of the old switch with respect to null.
+1
- it fixes several bugs of the current switch implementation:
- having to recompile the switch when you change the enum
- the switch on string being slow when the number of cases is small
- reduce the switch footprint in term of bytecodes
sounds good, but I have to see how useful this is outside the intended
use for pattern matching. It is for example unlikely to replace our most
annoying switch-case usage in Groovy internally, which is to select the
right "super" and "this" delegation call in a constructor
- and obviously allow to use a switch that "returns" an expression.
I don't think I would like to think of it as returning an expression ;)
In total I am not fully convinced that a lambda usage is bad here. But
then again maybe I am more willing to live with some trade-offs coming
from that approach than the EG is. It is just...
* reusing syntax elements and give it new semantics is bad
* introducing new syntax elements should be avoided
Those are principles I go with in language design. Sure,you can not
always keep that,so it is to be weighted with the gain, but the
switch-expressions seem to have quite the initial momentum to overcome
to show its value like that.
bye Jochen