public function map(array $args, Scheme_Env $env) { $this->requireExactly(2, $args); $this->requireList($args[1]); list($func, $list) = $args; $interp = $env->getInterpreter(); $result = array(); foreach ($list->listToArray() as $value) { $result[] = $interp->evaluate($env, Scheme_Utils::mkList($func, $value)); } return Scheme_Utils::arrayToList($result); }
public function evaluate(Scheme_Env $execEnv, array $args) { if (count($args) != count($this->argNames)) { throw new Scheme_Error("Expected " . count($this->argNames) . " but got " . count($args)); } $argCount = count($this->argNames); $interp = $execEnv->getInterpreter(); $bodyEnv = $this->defnEnv->createChildEnv(); for ($i = 0; $i < $argCount; ++$i) { $value = $interp->evaluate($execEnv, $args[$i]); $bodyEnv->bind($this->argNames[$i], $value); } return new Scheme_TailCall($this->body, $bodyEnv); }
public function letrec(array $args, Scheme_Env $env) { $this->requireExactly(2, $args); $bindings = $args[0]; $body = $args[1]; $interpreter = $env->getInterpreter(); $newEnv = $env->createChildEnv(); $this->requireList($bindings); $initedBindings = array(); foreach ($bindings->listToArray() as $binding) { $this->requireList($binding); $bindingArray = $binding->listToArray(); $this->requireExactly(2, $bindingArray); $var = $bindingArray[0]; $expr = $bindingArray[1]; $this->requireSymbol($var); $value = $interpreter->evaluate($newEnv, $expr); $initedBindings[$var->value] = $value; } $newEnv->bindAll($initedBindings); return new Scheme_TailCall($body, $newEnv); }