On Wed, May 12, 2021, at 4:51 AM, Nicolas Grekas wrote:

> > > This makes me wonder: can we create a partial programmatically? Wouldn't
> > > that be needed for some use cases?
> > > Partial::createFromCallable($callable, the-args)?
> > >
> > > Nicolas
> >
> > I cannot think of a use case where that would be needed.  Since you can
> > partial-ize any callable, including a dynamic one, if you needed to do
> > something like partial-ize one of a series of function calls you can do
> > that already:
> >
> > $c = match($some_input) {
> >   'A' => 'func_a',
> >   'B' => 'func_b',
> >   'C' => 'func_c',
> > };
> >
> > $p = $c(1, 2 ?, 4);
> >
> > Though at that point, just partialing them in the first place inside the
> > match would be better as then you never have a function name in a string to
> > begin with.
> >
> 
> Here is a use case: high-order argument resolvers / function reducers.
> 
> What I mean is a function that takes a callable as arguments, resolves as
> many args of the callable as it can using whatever logic fits, and returns
> a callable with fewer arguments (only the non-resolved ones - aka a
> Partial).

You're thinking something like an auto-wiring routine for callables?  

function volume(int $x, int $y, int $z) { ... }

class Resolver {
  private array $context = ['x' => 5];

  public resolve(callable $c) {
    foreach (get_argument_names_from_param($c) as $k) {
      if (isset($this->context[$k]) {
        $args[$k] = $this->context[$k];
      }
    }
    return $c(...$args, ?);
  }
}

$r = new Resolver();
$c2 = $r->resolve(volume(?));

print $c2(y: 3, z: 9);

I haven't tried running that (I don't feel like messing with the necessary 
reflection), but... I think it would work already?  Whether that's useful in 
practice or not I don't know. :-)

--Larry Garfield

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

Reply via email to