Re: First-class types RFC
| From: | Rowan Tommins [IMSoP] | Date: | Sat, 09 Nov 2024 12:33:22 +0000 |
| Subject: | Re: First-class types RFC | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125932@lists.php.net to get a copy of this message | ||
On 9 November 2024 08:39:57 GMT, Adam Kecskes <kecskes.adam@outlook.com> wrote:
>I propose adding first-class types to PHP, as this feature could greatly enhance the language,
>especially given PHP's unique runtime type-checking system. Many libraries currently rely on
>class strings as function parameters, which could be made significantly safer with native types
>rather than strings.
Hi Adam,
I think this is an interesting idea to think about, although I have no idea what the implementation
might look like.
One of the things I've been thinking about for some time is how to improve PHP's type
casting functionality, and a key sticking point is a sufficiently flexible syntax. Not wanting to
get into the casting itself, let's imagine we want to add "foo casts", available for
all types, including unions, nullable types, etc; options seem to be:
- foo_cast("int|string", $value) - a "stringly typed" function with no new
syntax; flexible, but ugly and awkward to statically analyse
- foo_cast($value as int|string) - a new keyword for each type of cast; expressive, but a high
barrier to adding more casting options
- foo_cast<int|string>($value) - if we add generics, even without type inference, that syntax
could be used to "specialise" by type
- foo_cast(int|string, $value) - passing the type as a parameter would read very nicely
There's a lot of overlap between the last two, but also some differences:
- generics give a clear way of expressing that the function will return the given type, or perhaps
some manipulation of it, like "function foo_cast<T>(mixed $value): T|CastError"
- first-class types, on the other hand, give a clear way for userland to pass around type
specifications, like "function cast_in_turn(mixed $value, type ...$types): array { /* loop over
$types, calling foo_cast($type, $value) for each one */ }"
Would first-class types and generics need to be mutually exclusive, to avoid a confusing overlap of
functionality? Or could they be made explicitly complementary somehow?
I wonder what prior art there is in this area, in both the theory of type systems, and the practice
of language implementations?
Regards,
Rowan Tommins
[IMSoP]