Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
 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);
 }