Ejemplo n.º 1
0
 private function evalCode($code, array $envVars = array())
 {
     $parser = new Scheme_Parser($code);
     $expr = $parser->parse($code);
     $env = $this->rootEnv->createChildEnv();
     $env->bindAll($envVars);
     return $this->interp->evaluate($env, $expr);
 }
Ejemplo n.º 2
0
 public function bindToEnv(Scheme_Env $env)
 {
     foreach ($this->getLibraryMethods() as $method) {
         $name = $this->mapMethodName($method);
         $env->bind($name, new Scheme_PhpCallback(array($this, $method), $name));
     }
     foreach ($this->getSpecialFormMethods() as $method) {
         $name = $this->mapMethodName($method);
         $env->bind($name, new Scheme_PhpSpecialFormCallback(array($this, $method), $name));
     }
 }
Ejemplo n.º 3
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.º 4
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.º 5
0
 public function evaluate(Scheme_Env $env, Scheme_Value $expr)
 {
     while (true) {
         if ($expr instanceof Scheme_Symbol) {
             return $env->get($expr->value);
         } elseif ($expr instanceof Scheme_Pair) {
             $result = $this->apply($env, $expr->car, $expr->cdr->listToArray());
             if ($result instanceof Scheme_TailCall) {
                 $expr = $result->expr;
                 $env = $result->env !== null ? $result->env : $env;
             } else {
                 assert('$result instanceof Scheme_Value');
                 return $result;
             }
         } else {
             return $expr;
         }
     }
 }
Ejemplo n.º 6
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);
 }