def procedure_tr(self, ctx, lst): if len(lst) != 2: raise WrongArgsNumber (w_procedure, w_lst) = lst if not isinstance(w_procedure, W_Procedure): raise WrongArgType(w_procedure, "Procedure") if not isinstance(w_lst, W_List): raise WrongArgType(w_lst, "List") return w_procedure.call_tr(ctx, w_lst)
def oper(self, x, y): if isinstance(x, W_Integer) and isinstance(y, W_Integer): return W_Integer(self.do_oper(x.to_fixnum(), y.to_fixnum())) elif isinstance(x, W_Number) or isinstance(y, W_Number): return W_Real(self.do_oper(x.to_float(), y.to_float())) else: raise WrongArgType(x, "Number")
def unary_oper(self, x): if isinstance(x, W_Integer): return W_Integer(self.do_unary_oper(x.to_fixnum())) elif isinstance(x, W_Number): return W_Real(self.do_unary_oper(x.to_float())) else: raise WrongArgType(x, "Number")
def procedure(self, ctx, lst): if len(lst) < 2: return W_Boolean(True) prev = lst[0] if not isinstance(prev, W_Number): raise WrongArgType(prev, "Number") for arg in lst[1:]: if not isinstance(arg, W_Number): raise WrongArgType(arg, "Number") if prev.to_number() != arg.to_number(): return W_Boolean(False) prev = arg return W_Boolean(True)
def procedure(self, ctx, lst): w_pair = lst[0] w_obj = lst[1] if not isinstance(w_pair, W_Pair): raise WrongArgType(w_pair, "Pair") w_pair.cdr = w_obj return w_undefined
def procedure(self, ctx, lst): if len(lst) != 1: raise WrongArgsNumber w_obj = lst[0] if not isinstance(w_obj, W_Number): raise WrongArgType(w_obj, "Number") return W_Boolean(self.predicate(w_obj))
def procedure(self, ctx, lst): if len(lst) != 1: raise WrongArgsNumber w_promise = lst[0] if not isinstance(w_promise, W_Promise): raise WrongArgType(w_promise, "Promise") return w_promise.force(ctx)
def procedure(self, ctx, lst): if len(lst) == 0: if self.default_result is None: raise WrongArgsNumber() return self.default_result if len(lst) == 1: if not isinstance(lst[0], W_Number): raise WrongArgType(lst[0], "Number") return self.unary_oper(lst[0]) acc = None for arg in lst: if not isinstance(arg, W_Number): raise WrongArgType(arg, "Number") if acc is None: acc = arg else: acc = self.oper(acc, arg) return acc
def predicate(self, w_obj): if not w_obj.is_integer(): raise WrongArgType(w_obj, "Integer") return w_obj.round() % 2 == 0
def procedure(self, ctx, lst): w_pair = lst[0] if not isinstance(w_pair, W_Pair): raise WrongArgType(w_pair, "Pair") return w_pair.cdr