Re: First-class callable partial application
| From: | Robert Landers | Date: | Sat, 11 Mar 2023 22:48:21 +0000 |
| Subject: | Re: First-class callable partial application | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-119684@lists.php.net to get a copy of this message | ||
On Fri, Mar 10, 2023 at 10:56 PM Christian Schneider
<cschneid@cschneid.com> wrote:
>
> Am 10.03.2023 um 20:04 schrieb Eugene Sidelnyk <zsidelnik@gmail.com>:
> > Another simplified example:
> >
> > ```
> > // partial application
> > foo(bar(1, ...));
>
> While it is not as concise as your version I think the work-around with short arrow functions
> works ok unless your code is full of partial applications:
> foo(fn(...$a) => bar(1, ...$a));
>
> Regards,
> - Chris
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>
Hey Eugene
I actually started on an implementation with this exact syntax this
past summer. I stopped after seeing the RFC was already declined years
ago. However, there are still some tricky parts to work out. Right
now, the "first-class callable" gets (basically) turned into a
callable string at the first possible instant, just after parsing.
This has to be thrown away, or handled in some other way. In my
implementation, I went with treating that as a special case, and
basically considering the partial application as 'syntax sugar'. There
are also other issues with the grammar, which I'll get to in a few
minutes.
My "syntax sugar" implementation was that this:
return $this->cache->get($command->getPhone(), $this->storeOtp($command, ....));
gets turned into this:
return fn(...$x) => $this-cache->get($command->getPhone(),
$this->storeOtp($command, ...$x));
There were a number of edge cases to solve, but I stopped
implementation before I got there.
The biggest issue was that the grammar became a little bit ambiguous.
I'm sure someone smarter than me can figure out how to define the
grammar in a way that isn't ambiguous... but the gist is that the
triple-dot is also used for array unpacking, thus I ended up disabling
that code path to get it to work.
I can probably clean up my code and submit a PR, if anyone would be interested.
Cheers,
Rob