Guards -- not just for switch!
Remi Forax
forax at univ-mlv.fr
Wed Nov 29 22:20:50 UTC 2017
----- Mail original -----
> De: "Guy Steele" <guy.steele at oracle.com>
> À: "Brian Goetz" <brian.goetz at oracle.com>
> Cc: "amber-spec-experts" <amber-spec-experts at openjdk.java.net>
> Envoyé: Mercredi 29 Novembre 2017 22:49:23
> Objet: Re: Guards -- not just for switch!
> Um, let’s be careful here. See below.
>
>> On Nov 29, 2017, at 4:54 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
>>
>> As we've swirled around the design space on pattern matching, it seems the
>> sensible place to land is to not provide explicit syntax for AND and OR
>> patterns, but to support guards on case labels:
>>
>> case Foo(String s)
>> where (s.length() > 0): ...
>>
>> In the course of a separate discussion, we realized that guards can profitably
>> go in some other places, too. Like methods/constructors:
>>
>> public Range(int lo, int hi)
>> where (lo <= hi) {
>> this.lo = lo;
>> this.hi = hi;
>> }
>>
>
> The two situations are not analogous, because if a case clause fails you just
> try the next one, but if a constructor fails you don’t try another constructor.
>
> If we use the term “where” on a constructor, then Joe Programmer (that's me)
i was thinking you were more a random Guy :)
> will probably be very surprised if
>
> switch (x) {
> case Foo(String s)
> where (s.length() > 0): ...
> case Foo(String s)
> where (s.length() == 0): ...
> }
>
>
> works, but
>
> public Interval(int lo, int hi)
> where (lo <= hi) {
> this.lo = lo;
> this.hi = hi;
> this.exterior = false;
> }
>
> public Interval(int lo, int hi)
> where (lo > hi) {
> this.lo = lo;
> this.hi = hi;
> this.exterior = true;
> }
>
> does not work.
>
> It might make sense to use a word such as “requires” or “assert” rather than
> “where” in the constructor case.
yes, it's the whole design by contract thingy, i vote for "requires" like in Eiffel,
record Apple(int seed)
requires seed >= 0;
>
> —Guy
Rémi
More information about the amber-spec-experts
mailing list