Um, let’s be careful here. See below.
> On Nov 29, 2017, at 4:54 PM, Brian Goetz <[email protected]> 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)
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.
—Guy