On 21/06/2024 14:43, Robert Landers wrote: > On Fri, Jun 21, 2024 at 5:08 AM Andreas Hennings <andr...@dqxtech.net> wrote: >> >>> Ilija and I have been working on and off on an RFC for pattern matching >>> since the early work on Enumerations. >> >> I like what I see, a lot! >> One quick thought that came to my mind, regarding objects: >> Could we check method return values? >> >> if ($x is Countable { count(): 0 }) ... >> if ($p is Point { getX(): 3 }) ... >> if ($x is Stringable { __toString(): 'hello' }|'hello') ... >> while ($it is Iterator { valid(): true, current(): $value, next(): null }) >> ... >> >> Maybe it goes too far. >> >> For the variable binding, I noticed that we can overwrite the original >> variable: >> $x is SomethingWrapper { something: $x } >> In this case the bool return is not really needed. >> For now this usage looks a bit unintuitive to me, but I might change >> my mind and grow to like it, not sure. >> >> >> For "weak mode" ~int, and also some other concepts, I notice that this >> RFC is ahead of the type system. >> >> E.g. should something like array<int> be added to the type system in >> the future, or do we leave the type system behind, and rely on the new >> "guards"? >> public array $values is array<int> >> OR >> public array<int> $values >> >> The concern here would be if in the future we plan to extend the type >> system in a way that is inconsistent or incompatible with the pattern >> matching system. >> >> --- Andreas > > I'm always surprised why arrays can't keep track of their internal > types. Every time an item is added to the map, just chuck in the type > and a count, then if it is removed, decrement the counter, and if > zero, remove the type. Thus checking if an array is `array<int>` > should be a near O(1) operation. Memory usage might be an issue (a > couple bytes per type in the array), but not terrible.... but then > again, I've been digging into the type system quite a bit over the > last few months.
And every time a modification happens, directly or indirectly, you'll have to modify the counts too. Given how much arrays / hash tables are used within the PHP codebase, this will eventually add up to a lot of overhead. A lot of internal functions that work with arrays will need to be audited and updated too. Lots of potential for introducing bugs. It's (unfortunately) not a matter of "just" adding some counts.