def run_repl(comp=None): """ Starts the repl. Assumes that RT.init has allready be called. """ print "clojure-py", VERSION print "Python", sys.version if comp is None: curr = currentCompiler.get(lambda: None) if curr == None: comp = Compiler() currentCompiler.set(comp) else: comp = curr comp.setNS(symbol("user")) core = sys.modules["clojure.core"] for i in dir(core): if not i.startswith("_"): setattr(comp.getNS(), i, getattr(core, i)) last3 = [None, None, None] def execute(string): r = StringReader(string) s = read(r, False, None, True) res = comp.compile(s) return comp.executeCode(res) while 1: #for i, value in enumerate(last3, 1): # v = findVar(symbol("clojure.core", "*%s" % i)) # if isinstance(value, Var): # v.bindRoot(value.deref()) # v.setMeta(value.meta()) # else: # v.bindRoot(value) try: line = raw_input(comp.getNS().__name__ + "=> ") except EOFError: print break if not line: continue invalid = False while 1: unbalance = unbalanced(line) if unbalance == -1: invalid = True break elif unbalance is False: break try: new_line = '\n' + raw_input('.' * len(comp.getNS().__name__) + '.. ') except EOFError: break if not new_line.strip().startswith(';'): line += new_line if invalid: print "Invalid input" continue # Propogate break from above loop. if unbalanced(line): break try: out = execute(line) except Exception: traceback.print_exc() else: last3.pop() last3.insert(0, out) RT.printTo(out)
def run_repl(opts, comp=None): """Initializes and runs the REPL. Assumes that RT.init has been called. Repeatedly reads well-formed forms from stdin (with an interactive prompt if a tty) and evaluates them (and prints the result if a tty). Exits on EOF. """ if not opts.quiet and os.isatty(0): print VERSION_MSG if comp is None: curr = currentCompiler.get(lambda: None) if curr == None: comp = Compiler() currentCompiler.set(comp) else: comp = curr comp.setNS(Symbol("user")) core = sys.modules["clojure.core"] for i in dir(core): if not i.startswith("_"): setattr(comp.getNS(), i, getattr(core, i)) line = opts.cmd last3 = [None, None, None] def firstLinePrompt(): return comp.getNS().__name__ + "=> " if os.isatty(0) else "" def continuationLinePrompt(): return "." * len(comp.getNS().__name__) + ".. " if os.isatty(0) else "" while True: # Evaluating before prompting caters for initially given forms. r = StringReader(line) while True: try: s = read(r, False, None, True) if s is None: break res = comp.compile(s) out = comp.executeCode(res) except Exception: traceback.print_exc() else: if os.isatty(0): RT.printTo(out) last3.pop() last3.insert(0, out) for i, value in enumerate(last3, 1): v = findItem(Namespace("clojure.core"), Symbol("*{0}".format(i))) if isinstance(value, Var): v.bindRoot(value.deref()) v.setMeta(value.meta()) else: v.bindRoot(value) try: line = raw_input(firstLinePrompt()) while unbalanced(line): line += "\n" + raw_input(continuationLinePrompt()) except BracketsException as exc: print exc continue except EOFError: print break