Re: First-class callable partial application

From: 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

« previous php.internals (#119684) next »