Some background / personal experience
(cross-posting with Stanislav, but I am sending it anyway)

I regularly see code with arrays in loops, where the ??+= or ??++
would be nice to have.
I do not remember seeing use cases for *=.
In all the cases I remember, the left side was an array offset, not a
plain variable.

I think the spec has to be for plain variables first, even if the main
use case is arrays.
I only added the ??*=, ??-=, ??++, ??-- for completeness, but I can
live without.


On 18 January 2018 at 23:58, Stanislav Malyshev <smalys...@gmail.com> wrote:
> I think this is taking it too far. If you want language like that, you
> always have APL :)

It looks a bit cluttery (one character too many for an operator?), but
I think it is useful and intuitive.
If you understand ??, ??= and +=, you also understand ??+=.
But let's see what others say.


On 18 January 2018 at 23:52, Andreas Hennings <andr...@dqxtech.net> wrote:
> The "Null Coalescing Assignment Operator" (or null coalesce assignment
> operator) was proposed and accepted in
> https://wiki.php.net/rfc/null_coalesce_equal_operator
>
> I propose even more such operators:
> null coalesce addition assignment ??+= (for strings and numbers)
> null coalesce subtraction assignment ??-=
> null coalesce increment ??++
> null coalesce decrement ??--
> null coalesce multiplication assingment ??*=
>
>
> ## Details
>
> Each block contains 3 equivalent statements.
>
> $x ??+= 5;  // proposed new syntax
> ($x ??= 0) += 5;  // syntax with null coalesce assignment operator
> $x = ($x ?? 0) + 5;  // syntax with simple null coalesce operator
>
> $x ??+= 'suffix';  // proposed new syntax
> ($x ??= '') += 'suffix';  // syntax with null coalesce assignment operator
> $x = ($x ?? '') + 'suffix';  // syntax with simple null coalesce operator
>
> $x ??++;  // proposed new syntax
> ($x ??= 0)++;
> $x = ($x ?? 0) + 1;
>
> $x ??*= 2;  // proposed new syntax
> ($x ??= 1) *= 2;
> $x = ($x ?? 1) * 2;
>
> Note that in each case PHP needs to determine the "neutral element" of
> the operation.
> For string concat this is the empty string. For number addition this
> is 0. For number multiplication it is 1.
>
>
> ## Example:
>
> For me, the most common use case would be something like this:
>
> $fruitpacks = [
>   ['apples', 3],
>   ['pears', 1],
>   ['apples', 6],
>   ['grapes', 22],
> ];
>
> $totals_by_name = [];
> foreach ($fruitpacks as [$name, $amount]) {
>   $totals_by_name[$name] ??+= $amount;  // proposed new syntax
> }
>
> $totals_by_name_expected = [
>   'apples' => 9,
>   'pears' => 1,
>   'grapes' => 22,
> ];
>
> assert($totals_by_name === $totals_by_name_expected);
>
>
> ## Notes
>
> In PHP, the "+=" operator already behaves almost like "??+=", but adds
> a "Notice: Undefined offset" or "Notice: Undefined variable", if the
> left side is not defined yet.
> hhvm apparently does not produce this notice.
> https://3v4l.org/l0l0K

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

Reply via email to