[External] : Re: Reviewing feedback on patterns in switch
forax at univ-mlv.fr
forax at univ-mlv.fr
Wed Feb 16 16:19:02 UTC 2022
> From: "Brian Goetz" <brian.goetz at oracle.com>
> To: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "amber-spec-experts" <amber-spec-experts at openjdk.java.net>
> Sent: Wednesday, February 16, 2022 3:57:39 PM
> Subject: Re: [External] : Re: Reviewing feedback on patterns in switch
> OK, I'll make you a deal: I'll answer your question about let/bind, under the
> condition that we not divert the discussion on that right now -- there'll be a
> proper writeup soon. The answer here is entirely for context.
> If you don't agree, stop reading now :)
I think it's wiser to delay the discussion about let for later :)
Rémi
> On 2/15/2022 5:58 PM, Remi Forax wrote:
>>> - There are future constructs that may take patterns, and may (or may not) want
>>> to express guard-like behavior, such as `let` statements (e.g., let .. when ..
>>> else.) Expressing guards here with && is even less evocative of "guard
>>> condition" than it is with switches.
>> It's not clear to me how to use "let when else". Is it more like a ?: in C than
>> the let in in Caml ?
> The simplest form of `let` is a statement that takes a total pattern:
> let Point(var x, var y) = aPoint;
> and introduces bindings x and y into the remainder of the block. When
> applicable, this is better than a conditional context because (a) you get type
> checking for totality, and (b) you don't indent the rest of your method inside
> a test that you know will always succeed.
> If the pattern is total but has some remainder, the construct must throw on the
> remainder, to preserve the invariant that when a `let` statement completes
> normally, all bindings are DA.
> What if I want to use a partial pattern, and then customize either the throwing
> part or provide default values? I can provide an else clause:
> Object o = ...
> let String s = o
> else throw new NotStringException();
> or
> Object o = ...
> let String s = o
> else { s = "no string"; }
> These are two ways to preserve the "DA on normal completion" invariant; either
> by not completing normally, or by ensuring the bindings are DA.
> Now, we are in a situation where we are with switch: patterns do not express all
> possible conditions. Which is why we introduced guards to switches. And we can
> use the same trick here:
> Object o = ...
> let String s = o
> when (!s.isEmpty())
> else { s = "no string"; }
> If we tried to use && here, it would look like
> Object o = ...
> let String s = o && (!s.isEmpty())
> else { s = "no string"; }
> which has the same problem as `case false && false`.
> Reminder: THIS EXPLANATION WAS PROVIDED SOLELY TO CLARIFY THE "FUTURE CONSTRUCT"
> COMMENT IN THE && DISCUSSION.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20220216/a2781ef5/attachment-0001.htm>
More information about the amber-spec-experts
mailing list