Hi Matthew and Larry
> On 17 Sep 2020, at 18:21, Larry Garfield <[email protected]> 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