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); }
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)); } }
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 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; } } }
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); }