On Fri, Jun 21, 2024, at 12:38 PM, Rowan Tommins [IMSoP] wrote: > On Thu, 20 Jun 2024, at 18:38, Larry Garfield wrote: >> Hello, peoples. >> >> Ilija and I have been working on and off on an RFC for pattern matching >> since the early work on Enumerations. A number of people have noticed >> and said they're looking forward to it. > > Hi Larry, > > I haven't time to read through the full RFC at the moment, but a couple > of thoughts: > > As Andreas says, we should be careful not to pre-empt things that might > be added to the type system in general, and end up with incompatible > syntax or semantics. That particularly applies to the generic-like > array<int> syntax, which is quite likely to end up in the language in > some form.
As noted in another thread, I don't believe that would cause any engine-level conflicts. Whether it would cause human-level conflicts is another, and valid, question. > The "weak-mode flag" seems useful at first glance, but unfortunately > PHP has multiple sets of coercion rules, and some are ... not great. > It's also not immediately obvious which contexts should actually > perform coercion, and which should just assert that it's *possible* > (e.g. match($foo) is { ~int => (int)$foo } feels redundant). So I think > that would need its own RFC to avoid being stuck with something > sub-optimal. We *still* have different implicit coercion rules? I assumed it would be implemented to match weak-mode parameters, not casting. Though I agree, there are devils in the details on this one. > Similarly, the "as" keyword has potential, but I'm not sure about the > naming, and whether it should be more than one feature. Asserting a > type, casting between types, and de-structuring a type are all > different use cases: > > $input = '123'; $id = $input as int; // looks like a cast, but actually > an assertion which will fail? > $handler as SpecialHandler; // looks like an unused expression, but > actually an assertion? > $position as [$x, $y]; // looks like its writing to $position, but > actually the same as [$x, $y] = $position? > > It's worth noting that in languages which statically track the type of > a variable, "$foo = $bar as SomeInterface" is actually a type of object > cast; but in PHP, it's the value that tracks the type, and interfaces > are "duck-typed", so it would be equivalent to "assert($bar is > SomeInterface); $foo = $bar;" which isn't quite the same thing. Valid points. The line between validation and casting is a bit squishy, as some casts can be forced (eg, string to int gives 0 sometimes), and others just cannot (casting to an object). So would $a as array<~int> be casting, validating, or both? Patterns make sense for validating, so it's natural to look to them for validate-and-cast. Though I recognize it could then complicate the cast-only case, if it exists. --Larry Garfield