Hi Matthew and Larry > On 17 Sep 2020, at 18:21, Larry Garfield <la...@garfieldtech.com> wrote: > > On Thu, Sep 17, 2020, at 10:21 AM, Matthew Brown wrote: >> Quick thing before I get into my own reaction: >> >> Transpiling is normally thought of as the process of converting one >> language into another. Tools like Babel transpile TypeScript to JavaScript.
I looked up the definition [1] before writing my mail and it said > A […] transpiler is a type of translator that takes the source code of a > program written in a programming language as its input and produces an > equivalent source code in the same or a different programming language But I don't want to get stuck on phrasing, if elidiing is the right term as Larry suggests, let's go with it! >> >> What's being proposed here (AFAICT) is type erasure – the generic type >> information would be erased during the conversion to opcodes. >> >> Python (the language) has type erasure for all its types (including its >> generic types), so no popular Python interpreters check that a function >> call's argument types match up with the function signature. I didn't know about Python's approach before, and I think it's validating the idea, it's at least something worth looking into. >> >> PHP currently does not erase any types so the opcodes generated by PHP's >> interpreter include type checks for all the arguments passed to a typed >> function signature. >> >> Hack follows PHP's model, but erases generic types by default (though has >> more recently introduced the concept of reified generics) in much the same >> way you're proposing. > > I concur; this is type elidiing, not transpiling. Transpiling implies a > user-triggered pre-run step. I know Sara has mused about it before but it's > not happened yet. > > Basically what is being proposed (for those who need a concrete example) is > you'd write this: > > class Collection<T> { > > public function add(T $item) { ... } > > } > $c = new Collection<Product>(). > > And linters would recognize that, and it would parse, but at runtime it would > compile to: > > class Collection { > > public function add(mixed $item) { ... } > > } > $c = new Collection(). > > > And that's the opcodes that would be saved. (I'm hand-waving a lot here.) > > I would be on board with this, although I would ask if it's possible to > provide some compile time checks; I'm thinking LSP validation, which is still > relevant for inheritance with generics. Beyond that, leave the runtime to > not enforce it. (I have no idea how viable that is, but Sara seemed to think > it would work so it probably I agree that's an approach worth looking into. I didn't want to discuss specifics yet, and first get a feel of what people think of the general idea, but it's good that you're mentioning this, and I'm glad others are open to the idea. > > Another possibility could be to desugar that original to: > > class Collection { > public $__T; > > public function add(mixed $item) { > if (!$item instanceof $this->__T) { > throw new TypeError(); > } > } > } > $c = new Collection(). > $c->__T == 'Product'; > > Which is essentially what you can do in userspace today, but automated. I > don't know how viable that is, but it's another thing to consider. > > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > Kind regards Brent [1] https://en.wikipedia.org/wiki/Source-to-source_compiler -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php