> On May 14, 2021, at 6:09 PM, Paul Crovella <paul.crove...@gmail.com> wrote:
> 
> On Fri, May 14, 2021 at 2:49 PM Aaron Piotrowski <aa...@trowski.com> wrote:
>> 
>> Consider `function foo(int $x, int $y, int $z) {}` with a partial defined as 
>> `$partial = foo(?, 42)`.
>> 
>> If the partial is called as `$partial(73, 8)`, should 8 be forwarded to `$z` 
>> or should the call error as providing too few arguments?
> 
> The 8 passes along to $z. There is no error, all required arguments
> have been provided.

In the current proposal, yes. In a hypothetical implementation where ? 
represented a single argument, I was asking what made sense. In that situation, 
I think 8 passing along still makes sense.

> 
>> Or perhaps should the partial declaration should error, as it should have 
>> been `foo(?, 42, ?)` or `foo(?, 42, ...?) so the partial provided all 
>> required arguments to foo.
> 
> I think this highlights where the misunderstanding of this feature is.
> Partial application is about binding arguments. ? isn't an argument,
> it's an argument placeholder. It does two things: signals to create a
> closure wrapping the function rather than calling it immediately, and
> holds a position in the argument list so that an argument further to
> the right can be fixed (bound) at that time. Arguments are bound;
> argument placeholders are not, they exist only for convenience. The
> syntax `foo(?, 42)` doesn't call foo, let alone provide any arguments
> to it, it simply creates a closure that'll pass along 42 at the
> appropriate argument position along with whatever else it's provided
> with.
> 
> Requiring additional trailing argument placeholders or adding an
> additional token `...?` unnecessarily complicates things, burdens the
> user, and only serves to further promote misunderstanding.
> 

My issue is the dual-meaning of ? in the current proposal. In `foo(?, 42)`, the 
? represents a single argument, but adding a trailing ? (such as in `foo(?, 42, 
?)`) represents any number of arguments. Would it perhaps make sense to make 
superfluous ? markers an error?

foo(?); // Fine, needed to define a partial with no bound args.
foo(?, 42); // Ok, binds second arg.
foo(?, ?, 42); // Ok, binds third arg.
foo(?, 42, ?); // Error, unnecessary placeholder.
foo(?, ?); // Error, unnecessary placeholder.

The intention here is to keep the syntax unambiguous.

foo(?) == foo(?, ?) == foo(?, ?, ?) and so forth is not going to be obvious to 
everyone, so why allow meaningless and misleading syntax.

Cheers,
Aaron Piotrowski

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to