On Wed, Sep 27, 2017 at 1:56 PM, Sara Golemon <poll...@php.net> wrote:

> On Thu, Sep 21, 2017 at 5:13 PM, Stanislav Malyshev <smalys...@gmail.com>
> wrote:
> > It'd be also nice then if we could have some syntax that allowed us to
> > refer to functions/methods as callables - mostly for the benefit of the
> > code readers and IDEs. I.e. you can do "hello" |> "strtoupper" and it's
> > fine but it is not at all intuitive what you're doing sending one string
> > into another. Same with "hello" |> [$this, 'bar']. Now, if we could do
> > something like this:
> > "hello" |> &{strtoupper}
> > "hello" |> &{$this->bar}
> >
> Super-hacky implementation (that I wouldn't want to merge, but it
> shows the syntax at work).
>
> https://github.com/php/php-src/compare/master...sgolemon:lambda
> which provides a form of both short-closures and partial functions.
>
> Combined with also-super-hacky pipe diff from earlier, you get:
>
> $x = "Hello"
>   |> &{strtoupper($0)}
>   |> &{ $0 . "world" }
>   |> &{strrev($0)};
>
> var_dump($x);
> // string(10) "dlrowOLLEH"
>
> -Sara
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>

By the way the `&` is not required. When experimenting with possible short
closure syntax I created an implementation for `{}` to make sure it was
possible:

  $x = "Hello"
    |> {strtoupper($0)}
    |> { $0 . "world" }
    |> {strrev($0)};

If people would prefer that syntax for short-closures then that's fine by
me. If we made it this concise there wouldn't be a need for a `$$` proposal
anyway.

---

My impression from the community is that the pipe operator is desirable but
not if it encourages string or array callables. In that vein which syntax
do you prefer?

  // brace style
  $x = "Hello"
    |> {strtoupper($0)}
    |> { $0 . "world" }
    |> {strrev($0)};

  // fn style
  $x = "Hello"
    |> fn($x) => strtoupper($x)}
    |> fn($x) => $x . "world"
    |> fn($x) => strrev($0);

  // caret style
  $x = "Hello"
    |> ^($x) => strtoupper($x)}
    |> ^($x) => $x . "world"
    |> ^($x) => strrev($0);

I included these two styles because they are the most promising versions
from the arrow functions discussions. I think my preferred order is the one
I wrote them in. The brace style is concise, nicely delimits the
expression, and seems the clearest for me to read because the symbols don't
dominate. The fn style seems nicer than caret which has too many symbols in
close proximity for my taste.

Community thoughts? Which short closure style pairs the nicest with the
pipe operator?

Reply via email to