On Thu, Jun 17, 2021, at 2:54 AM, Côme Chilliet wrote:
> Le Wed, 16 Jun 2021 11:16:28 -0500,
> "Larry Garfield" <[email protected]> a écrit :
>
> > Hi folks. The vote for the Partial Function Application RFC is now open,
> > and
> > will run until 30 June.
> >
> > https://wiki.php.net/rfc/partial_function_application
>
> I do not understand how this ... placeholder works, it feels inconsistent.
>
> From the examples:
>
> > $c = stuff(...);
> > $c = fn(int $i, string $s, float $f, Point $p, int $m = 0)
> > => stuff($i, $s, $f, $p, $m);
>
> > $c = stuff(1, 'hi', 3.4, $point, 5, ...);
> > $c = fn(...$args) => stuff(1, 'hi', 3.4, $point, 5, ...$args);
>
> Why is there an additional variadic parameter in this one?
... means "zero or more". In this case, it means zero, that is, it creates a
closure that requires no arguments and will call the original function with all
of the provided values later. This is the "deferred function" use case
mentioned further down.
> Also, in the second set of examples:
> > function things(int $i, float $f, Point ...$points) { ... }
>
> > // Ex 13
> > $c = things(...);
> > $c = fn(int $i, float $f, ...$args) => things(...[$i, $f, ...$args]);
>
> > // Ex 14
> > $c = things(1, 3.14, ...);
> > $c = fn(...$args) => things(...[1, 3.14, ...$args]);
>
> What happens to the typing of the variadic parameter here? Why is it removed?
>
> It would feel natural that the ... means "copy the rest of the parameters from
> signature". Here it seems it sometimes mean that, and sometimes mean "accept
> an
> additional variadic parameter and pass it along".
Internally placeholders do mean the former. A trailing variadic, though, can
accept extra arguments of potentially not pre-defined types, so it sort of
straddles the line. Variadics make things weird. :-) (Dating from PHP 5.6.)
In the majority case, though, thinking of them as "copy the rest of the
arguments" is accurate.
--Larry Garfield
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php