private function expandSubLists(Environment $env, ListForm $form) { if (!count($form->toArray())) { return $form; } return new ListForm(array_merge([$form->nth(0)], $this->expandList($env, $form->cdr()))); }
public function evaluate(Environment $env, ListForm $args) { $symbols = $args->nth(0)->toArray(); $argNames = $this->getMappedSymbols($symbols); $bodyForms = $args->cdr()->toArray(); return function () use($env, $argNames, $bodyForms) { $subEnv = clone $env; $vars = array_combine($argNames, func_get_args()); foreach ($vars as $name => $value) { $subEnv[$name] = $value; } $value = null; foreach ($bodyForms as $form) { $value = $form->evaluate($subEnv); } return $value; }; }