public function __invoke(array $nodes, Environment $env, Node $self) { if (count($nodes) !== count($this->argNames)) { throw new BadCallException(sprintf('`%s` expects %d arguments, got %d near %s', $self instanceof IdentifierNode ? $self->rawIdent() : 'Anonymous Function', count($this->argNames), count($nodes), $self->context())); } $env->put('recur', $this); foreach (array_combine($this->argNames, $nodes) as $name => $node) { $env->put($name, $node->evaluate($env)); } $value = null; $closure = new ClosureEnvironment($env, $this->wrappedEnv); foreach ($this->nodes as $node) { $value = $node->evaluate($closure); } return $value; }
private function checkNumeric($value, Node $node, Node $self) { if (!is_numeric($value)) { throw new BadCallException(sprintf('`%s` expected numeric arguments, got "%s" near %s', $self->rawIdent(), $value, $node->context())); } }