def eval(self, program): """Evaluate this program in a fresh environment with the prelude already included. Returns the result of the last expression. """ # Fresh copy of the environment so tests don't interfere with one another. env = Environment([Scope({})]) global_scope = self.env.scopes[0] for key, value in global_scope.bindings.iteritems(): # We do a deep copy of mutable values. if isinstance(value, List): env.set(key, deepcopy(value)) elif isinstance(value, String): env.set(key, deepcopy(value)) elif isinstance(value, Bytestring): env.set(key, deepcopy(value)) else: env.set(key, value) parse_tree = parse(lex(program)) if isinstance(parse_tree, TrifleExceptionInstance): self.fail("Parse error on: %r" % program) result = NULL for expression in parse_tree.values: result = evaluate(expression, env) if is_thrown_exception(result, error): return result return result
def evaluate_with_prelude(expression): return evaluate(expression, env_with_prelude())