Re: State of Generics and Collections
| From: | Mike Schinkel | Date: | Tue, 20 Aug 2024 00:44:40 +0000 |
| Subject: | Re: State of Generics and Collections | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125059@lists.php.net to get a copy of this message | ||
> On Aug 19, 2024, at 7:37 PM, Rob Landers <rob@bottled.codes> wrote:
> As an experiment, awhile ago, I went a different route for reified generics by
> 'hacking' type aliases (which I was also experimenting with). Such that a generic becomes
> compiled into a concrete implementation with a dangling type alias:
>
> class Box<T> {
> function __construct(T $thing) {}
> }
>
> is essentially compiled to
>
> class Box {
> use alias __Box_T => ???;
>
> function __construct(__Box_T $thing) {}
> }
>
> This just gets a T type alias (empty-ish, with a mangled name) that gets filled in during
> runtime (every instance gets its own type alias table, and uses that along with the file alias
> table). There shouldn't be any performance impact this way (or at least, as bad as using type
> aliases, in general; which is also an oft-requested feature).
From what I understand this is essentially how Go implements Generics. So +1 for considering this
approach.
> FYI though, people seemed really turned off by file-level type aliases (at least exposed to
> user-land, so I never actually pursued it).
Shame. Type aliases are super useful in practice in other languages, with many used for single-file
scope in my experience.
-Mike