def run(args): env = primitive.extended_environment() _, filename = args try: program = primitive.parse_file(filename) primitive.kernel_eval(program, env, kt.root_cont) except kt.KernelExit: pass return 0
def guarded_ad_hoc_cont(cont): from parse import parse import primitive import kernel_type as kt s = primitive.standard_value env = primitive.standard_environment() env.set(kt.get_interned('cont'), primitive.AdHocCont(cont)) return primitive.kernel_eval( kt.Pair(primitive.standard_value("$sequence"), parse("""(guard-continuation () cont (list (list error-continuation ($lambda (val divert) (println val) (apply divert #inert)))))""")), env)
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