def negative(vals): for v in kt.iter_list(vals): kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) if not v.lt(kt.zero): return kt.false return kt.true
def mul(vals): accum = kt.one for v in kt.iter_list(vals): kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) accum = accum.mul(v) return accum
def positive(vals): for v in kt.iter_list(vals): kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) if not kt.zero.lt(v): return kt.false return kt.true
def string_append(vals): s = rstring.StringBuilder() for v in kt.iter_list(vals): kt.check_type(v, kt.String) assert isinstance(v, kt.String) s.append(v.strval) return kt.String(s.build())
def add(vals): accum = kt.Fixnum(0) for v in kt.iter_list(vals): kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) accum = accum.add(v) return accum
def binds(vals, env, cont): pyvals = kt.pythonify_list(vals) if len(pyvals) < 1: kt.signal_arity_mismatch(">=1", vals) for symbol in pyvals[1:]: kt.check_type(symbol, kt.Symbol) env_expr = pyvals[0] return env_expr, env, kt.BindsCont(pyvals, cont)
def gt(vals): latest = kt.e_pos_inf for v in kt.iter_list(vals): kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) if not v.lt(latest): return kt.false latest = v return kt.true
def zerop(vals): for v in kt.iter_list(vals): # Robustness: we need to check the type of all elements, even those # after the first non-zero. kt.check_type(v, kt.Number) for v in kt.iter_list(vals): if not kt.zero.equal(v): return kt.false return kt.true
def apply_(vals, env_ignore, cont): ls = kt.pythonify_list(vals) if len(ls) == 2: applicative, args = ls env = kt.Environment([]) else: applicative, args, env = ls kt.check_type(applicative, kt.Applicative) return kt.Pair(applicative.wrapped_combiner, args), env, cont
def lteq(vals): latest = kt.e_neg_inf for v in kt.iter_list(vals): kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) if not latest.lt(v): return kt.false latest = v return kt.true
def sub(vals): ls = kt.pythonify_list(vals) if len(ls) < 2: kt.signal_arity_mismatch('>=2', vals) accum = ls[0] for v in ls[1:]: kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) accum = accum.sub(v) return accum
def lteq(vals): ls = kt.pythonify_list(vals) if len(ls) < 2: return kt.true latest = ls[0] for v in ls[1:]: kt.check_type(v, kt.Number) assert isinstance(v, kt.Number) if not latest.equal(v): return kt.false latest = v return kt.true
def wrapped(otree, *etc): args_tuple = () rest = otree for type_ in unroll_argtypes: assert isinstance(rest, kt.Pair) arg = rest.car rest = rest.cdr kt.check_type(arg, type_) assert isinstance(arg, type_) args_tuple += (arg,) assert kt.is_nil(rest) args_tuple += etc return fn(*args_tuple)
def orp(vals): rest = vals ret = kt.false while isinstance(rest, kt.Pair): v = rest.car kt.check_type(v, kt.Boolean) if kt.true.equal(v): ret = kt.true rest = rest.cdr if kt.is_nil(rest): return ret else: kt.signal_value_error("Called 'or?' with non-list", kt.Pair(vals, kt.nil))
def map_(vals, env, cont): try: args = kt.pythonify_list(vals) except kt.NonNullListTail: kt.signal_value_error("Argument tree to map is not a list", vals) else: if len(args) < 2: kt.signal_arity_mismatch(">=2", vals) app = args[0] kt.check_type(app, kt.Applicative) assert isinstance(app, kt.Applicative) lists = args[1:] return kt.map_(app.wrapped_combiner, transpose(lists), 0, env, cont)
def wrapped(otree, *etc): args_tuple = () rest = otree for type_ in unroll_argtypes: if isinstance(rest, kt.Pair): arg = rest.car rest = rest.cdr kt.check_type(arg, type_) if isinstance(arg, type_): args_tuple += (arg,) else: kt.signal_type_error(type_, arg) else: kt.signal_arity_mismatch(str(len(argtypes)), otree) if kt.is_nil(rest): args_tuple += etc return fn(*args_tuple) else: kt.signal_arity_mismatch(str(len(argtypes)), otree)
def extend_continuation(vals, env, cont): args = kt.pythonify_list(vals) if len(args) == 2: cont_to_extend, receiver = args recv_env = kt.Environment([]) else: cont_to_extend, receiver, recv_env = args kt.check_type(cont_to_extend, kt.Continuation) kt.check_type(receiver, kt.Applicative) kt.check_type(recv_env, kt.Environment) return kt.ExtendCont(receiver, recv_env, cont_to_extend), env, cont
def check_guards(guards): for guard in kt.iter_list(guards): selector, interceptor = kt.pythonify_list(guard) kt.check_type(selector, kt.Continuation) kt.check_type(interceptor, kt.Applicative) kt.check_type(interceptor.wrapped_combiner, kt.Operative)