def print_(val): if isinstance(val, kt.Pair): for v in kt.iter_list(val): print v.todisplay(), else: assert kt.is_nil(val) return kt.inert
def list_star(vals): assert isinstance(vals, kt.Pair) if isinstance(vals.cdr, kt.Pair): return kt.Pair(vals.car, list_star(vals.cdr)) elif kt.is_nil(vals.cdr): return vals.car else: return vals
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 pred(vals): result = kt.true rest = vals while isinstance(rest, kt.Pair): val = rest.car if not isinstance(val, cls): result = kt.false rest = rest.cdr if kt.is_nil(rest): return result else: kt.signal_value_error(("Called predicate '%s' with non-list" % name), kt.Pair(vals, kt.nil))
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 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 _debug_off(val): assert kt.is_nil(val) debug.stop_stepping() return kt.inert
def _debug_on(val): assert kt.is_nil(val) debug.start_stepping() return kt.inert
def listp(val): while isinstance(val, kt.Pair): val = val.cdr return kt.kernel_boolean(kt.is_nil(val))
def debug_interaction(env, cont): import kernel_type as kt import parse import primitive try: while True: os.write(1, "> ") cmd = readline() if cmd == "": if _state.latest_command is not None: cmd = _state.latest_command else: continue _state.latest_command = cmd if cmd.startswith(",c"): expr_src = cmd[2:].strip() if expr_src: dbgexprs = parse.parse(expr_src) assert isinstance(dbgexprs, kt.Pair) assert kt.is_nil(kt.cdr(dbgexprs)) expr = kt.car(dbgexprs) return expr, env, cont else: stop_stepping() break elif cmd == ",s": start_stepping() break elif cmd == ",n": _state.step_hook = ResumeContHook(cont) break elif cmd == ",r": prev = cont.prev while prev is not None and prev.source_pos is None: prev = prev.prev if prev is None: stop_stepping() else: _state.step_hook = ResumeContHook(prev) break elif cmd == ",e": print_bindings(env, recursive=False) elif cmd == ",E": print_bindings(env, recursive=True) elif cmd == ",q": raise kt.KernelExit else: dbgexprs = parse.parse(cmd) assert isinstance(dbgexprs, kt.Pair) assert kt.is_nil(kt.cdr(dbgexprs)) expr = kt.car(dbgexprs) old = _state.step_hook _state.step_hook = None try: dbgval = primitive.kernel_eval(expr, env, guarded_ad_hoc_cont(cont)) print dbgval.tostring() finally: _state.step_hook = old except EOFError: stop_stepping() return None, None, None