def compileDef(comp, form): if len(form) not in [2, 3]: raise CompilerException("Only 2 or 3 arguments allowed to def", form) sym = form.next().first() value = None if len(form) == 3: value = form.next().next().first() if sym.ns is None: ns = comp.getNS() else: ns = sym.ns comp.pushName(sym.name) code = [] v = internVar(comp.getNS(), sym) v.setDynamic(True) code.append((LOAD_CONST, v)) code.append((LOAD_ATTR, "bindRoot")) compiledValue = comp.compile(value) if isinstance(value, ISeq) \ and value.first().getName() == 'fn' \ and sym.meta() is not None: try: compiledValue[0][1].__doc__ = sym.meta()[keyword('doc')] except AttributeError: pass code.extend(compiledValue) code.append((CALL_FUNCTION, 1)) v.setMeta(sym.meta()) comp.popName() return code
def compileDef(comp, form): if len(form) not in [2, 3]: raise CompilerException("Only 2 or 3 arguments allowed to def", form) sym = form.next().first() value = None if len(form) == 3: value = form.next().next().first() if sym.ns is None: ns = comp.getNS() else: ns = sym.ns comp.pushName(sym.name) code = [] v = internVar(comp.getNS(), sym) v.setDynamic(True) v.setMeta(sym.meta()) code.append((LOAD_CONST, v)) code.append((LOAD_ATTR, "bindRoot")) code.extend(comp.compile(value)) code.append((CALL_FUNCTION, 1)) code.append((LOAD_CONST, v.setDynamic)) code.append((LOAD_CONST, False)) code.append((CALL_FUNCTION, 1)) code.append((POP_TOP, None)) comp.popName() return code
def compileDef(comp, form): if len(form) not in [2, 3]: raise CompilerException("Only 2 or 3 arguments allowed to def", form) sym = form.next().first() value = None if len(form) == 3: value = form.next().next().first() if sym.ns is None: ns = comp.getNS() else: ns = sym.ns comp.pushName(RT.name(sym)) code = [] v = internVar(comp.getNS(), sym) v.setDynamic(True) if len(form) == 3: code.append((LOAD_CONST, v)) code.append((LOAD_ATTR, "bindRoot")) compiledValue = comp.compile(value) if isinstance(value, ISeq) \ and value.first().getName() == 'fn' \ and sym.meta() is not None: try: compiledValue[0][1].__doc__ = sym.meta()[keyword('doc')] except AttributeError: pass code.extend(compiledValue) code.append((CALL_FUNCTION, 1)) else: code.append((LOAD_CONST, v)) v.setMeta(sym.meta()) comp.popName() return code
def compileDef(comp, form): if len(form) not in [2, 3]: raise CompilerException("Only 2 or 3 arguments allowed to def", form) sym = form.next().first() value = None if len(form) == 3: value = form.next().next().first() if sym.ns is None: ns = comp.getNS() else: ns = sym.ns comp.pushName(RT.name(sym)) code = [] i = getAttrChain("clojure.lang.var.intern") v = tr.Call(i, tr.Const(comp.getNS().__name__), tr.Const(sym.getName())) # We just wrote some treadle code to define a var, but # the compiler won't see that yet, so let's re-define the var now # so that the compiler can pick it up internVar(comp.getNS().__name__, sym.getName()) #v.setDynamic(True) if len(form) == 3: code = tr.Call(tr.Attr(v, "bindRoot"), comp.compile(value)) else: code = v with Quoted(comp): code = tr.Call(tr.Attr(code, "setMeta"), comp.compile(sym.meta())) #v.setMeta(sym.meta()) comp.popName() return code
def run_repl(comp=None): """ Starts the repl. Assumes that RT.init has allready be called. """ if comp is None: curr = currentCompiler.get(lambda: None) if curr == None: comp = Compiler() currentCompiler.set(comp) else: comp = curr comp.setNS(symbol("user")) 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): sym = symbol('*%s' % i) v = internVar(comp.getNS(), sym) v.setDynamic(True) 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: 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) print out