def syntaxLet(operands, env): binding_pairs = operands.car body = operands.cdr ptrees = (x.car for x in from_cons(binding_pairs)) forms = (x.cdr.car for x in from_cons(binding_pairs)) args_lists = [evaluate(form, env) for form in forms] bindings = match_let(ptrees, args_lists) return evaluate_seq(body, bindings + env)
def primArithmetic1(operands, env, arith): first, *args = list(evaluate(form, env) for form in from_cons(operands)) values = (arg.value for arg in args) result = functools.reduce(arith, values, first.value) if all(isinstance(arg, Exact) for arg in itertools.chain((first,), args)): return Exact(result) else: return Inexact(result)
def primArithmetic(operands, env, arith, start): args = list(evaluate(form, env) for form in from_cons(operands)) values = (arg.value for arg in args) result = functools.reduce(arith, values, start) if all(isinstance(arg, Exact) for arg in args): return Exact(result) else: return Inexact(result)
def apply(self, operands, env): args = to_cons(evaluate(form, env) for form in from_cons(operands)) bindings = match(self.ptree, args) + self.env return evaluate_seq(self.body, bindings)
def evaluate_seq(body, env): return evaluate_many(from_cons(body), env)
def primPrint(operands, env): # pragma: no cover print(*(evaluate(form, env) for form in from_cons(operands)))
def primList(operands, env): return to_cons(evaluate(form, env) for form in from_cons(operands))
def syntaxDefmacro(operands, env): var, ptree, *body = tuple(from_cons(operands)) macro = Macro(ptree, to_cons(body), env) env.add(var.name, macro) return macro
def syntaxDefine(operands, env): var, form = tuple(from_cons(operands)) result = evaluate(form, env) var.add(env, result) return result
def syntaxSetBang(operands, env): var, form = tuple(from_cons(operands)) result = evaluate(form, env) var.set(env, result) return result
def read_many(string): r = Reader(string) return from_cons(r.expressions())