Hey Caleb,

On 10.07.26 11:45, Caleb White wrote:
Hi internals,

I'd like to open discussion on my (first!) RFC for the pipe assignment operator 
(|>=):
https://wiki.php.net/rfc/pipe_assignment_operator

It adds a compound assignment form of the pipe operator, so that
$x |>= callable is shorthand for $x = $x |> callable, with
support for chaining. Implementation with tests is at:
https://github.com/php/php-src/pull/22633

Looking forward to your feedback.

Thanks!
Caleb

Thanks for the RFC! As you already could guess I am in support. Been running your implementation and didn't run into anything unexpected, nor was I able to break it in different ways than the current pipe behaviour. Though, I'd like to add the following.

1) This was feeling nitpicky at first, but it doesn't leave me alone since I first read your RFC. :) Now, given what Vadim added to the discussion, I think it is worth bringing it up. Right now we are doing:


```
$someVar = $someVar |> array_filter(...);
```

the RFC allows to omit the noise:

```
$someVar =                    |> array_filter(...);
```

you see where I am going; now let's remove the white space:

```
$someVar =|> array_filter(...);
```

my point is: why `|>=` and not `=|>`?

I think the latter would be more intuitive: assign the result of piping to the variable. I know that `|>=` follows the established `foo=` convention for compound assignments like `??=` or `.=`; which is an argument in its favour. Still, I think `=|>` better communicates how this particular operation expands. Especially when considering future additions like the ones Vadim proposes in future scope.

Because a side effect of having `=|>` would be that the right hand side of `|>` remains open to extension for potential in-pipe-behaviour modifying features like the ones Vadim proposes -- without the final assignment being affected. As in, `=|>` assigns the pipe result, while `=|>+`, `=|>-`, `=|> .`, `=|>whatever` allow modifying in-pipe behaviour. This would make sense because perhaps these pipe behaviour operators will also be allowed for non-shorthand assigned (`|>+`, `|> -`, `|> .` ) pipes that want the resulting immutable right hand side Larry made an argument for. Having a clear separation between assignment, and potential future additions to modify pipe behaviour makes sense. As in, want to add a modifying operator later? Cool, your assignment remains in tact `=|>`. You just add a modifying operator `=|>-` instead of flipping from `|>=` to `|>-=` which would affect final assignment *and* in-pipe behaviour -- having the modifier out of the final assignment decision is cleaner.

Also, it is not impossible that what Vadim proposes in future scope would result in something like `|>=??=` which IMO makes an even stronger point for strictly separating what is proposed here and potential future additions of modifying operators: `=|> .. |> ??=`. Because these *are* different: `... |> ??=` (for in-pipe operations) and `=|> ... |> ??=` (only for the final assignment). Vadims proposal makes sense on it's own, but it currently mixes two concerns: in-pipe operations and final assignment -- which I believe should be separated. Both of your proposals (especially Vadims future scope) should probably rather complement each other instead of competing; I think what I am writing here potentially could make this easier.

One additional soft argument is that text ligatures will show >= as ≥ which will just add to the confusion if modifying operators as Vadim proposes in future scope would ever be added.

Long story short: `=|>`over `|>=` IMO has a lot of appeal.

Though, I know not having `|>=` would deprive us of the "volcano operator" naming; sorry for being the party pooper.

2) Holly brought up this example:

```
$foo |>= a(…)
$foo |>= b(…)
$foo |>= c(…)
```

and it seems you talked past each other. Hollys example didn't end lines with semicolons, while your answer had them. Currently, the non-semicolon variant:

```
$foo = "hello";
$foo |>= strtoupper(...) // no semicolon
$foo |>= strtolower(...);
var_dump($foo);

```

throws with "Parse error: syntax error, unexpected variable "$foo" in". In the same way the current

```
$foo = "hello";
$foo |> strtoupper(...) // no semicolon
$foo |> strtolower(...);
var_dump($foo);
```

throws. I just wanted to point this out because apparently it caused confusion in the discussion. Perhaps worth to clarify the RFC (even though it's also current pipe behaviour).

3) I recently discovered a bug [1] when pipes are combined with property hooks. Unsurprisingly, with your addition it is the same. However, since this shows that pipes are not behaving everywhere identical it would probably be good to add some tests to confirm the interaction of assigned pipes with property hooks, readonly etc. -- and maybe also to clarify it in the RFC.


---

Cheers
Nick

[1] https://github.com/php/php-src/issues/22587

Reply via email to