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; }
public function evaluate(Environment $env) { switch ($this->ident) { case 'true': return true; break; case 'false': return false; break; case 'null': return null; break; default: return $env->get($this->ident); break; } }