Hi!

Am 31.8.2013 um 01:39 schrieb Stas Malyshev <smalys...@sugarcrm.com>:

> Hi!
> 
>> function short (...$args) {
>>    if (count($args))
>>        return long(...$args, "some value");
>> }
> 
> This is exactly the problem. Since $args has undefined number of
> arguments, there's no way to determine where "some value" ends up. Which
> means it's impossible to understand what's going on here. Now, if we had
> named arguments, like python had, then using "some value" as a named
> argument might work (and we'd need to see what to do with named
> arguments in this case), but as positional argument this just doesn't
> make much sense beyond some very esoteric things that nobody uses
> directly, without wrapping libraries (like partially applied functions)
> - at least in PHP.

That's why there is an if (count($args)) (I just forgot to add an == 7)

It should read:

function short (...$args) {
   if (count($args) == 7)
       return long(...$args, "some value");
}

And when you name the example with the "esoteric things", I'd like to have them
in the most readable format possible, which isn't achievable with 
func_get_args().

>> And I think you are really arguing about non-issues.
>> Example: Multiple uses of unpacking syntax makes sense when you call a
>> function with a variadic parameter:
>> 
>> function variadic (...$args) {
>>    // do something
>> } 
>> 
>> variadic(...$array1, ...$array2);
> 
> Again, since parameters in PHP are positional, they have meaning
> depending on position. If you just wanted to pass an array, pass an
> array, you don't need to use variadic syntax for that. Variadic syntax
> makes sense only if positions there have meanings and you want to give
> specific meanings to specific arguments in specific positions. In that
> case, ...$array1, ...$array2 doesn't work since you can not have
> meaningful positions. Only case where it works if you do functional
> operations like partial application, where the meaning of the function
> is not important but only the fact that it is a function is important.
> But I don't think we need special syntax to do such things.

I mean, it looks way cleaner to use this instead of:

call_user_func_array("variadic", array_merge($array1, $array2));

And no, the order isn't always important. Example:

function variadic (...$args) {
    return array_reduce($args, function ($a, $b) { return $a*$b; }, 1);
}

Yes, this is a very simple example, but just to show the idea of it.

And even when the order is important, it may be useful:

// according to implementation, arrays are expanded in insertion order here
// https://github.com/nikic/php-src/compare/variadics...splat#L11R3263
$short_default_options = [
    "arg1" => 1,
    "arg2" => 3,
    "arg3" => 7,
];

function short (...$extra_options) {
   global $short_default_options; // in classes, this would be a 
$this->short_options
   if (count($args) <= 3)
       return long(...$short_default_options, ...$extra_options);
}

function long ($arg1, $arg2, $arg3, $arg4 = 0, $arg5 = 0, $arg6 = 0) {
    // do something
}

> -- 
> Stanislav Malyshev, Software Architect
> SugarCRM: http://www.sugarcrm.com/
> (408)454-6900 ext. 227



Bob Weinand


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

Reply via email to