def fnReader(rdr, lparen): """Read an anonymous function #() from reader rdr -- a read/unread-able object lparen -- ignored Return an IPersistentList""" if ARG_ENV.deref() is not None: raise IllegalStateException("Nested #()s are not allowed") pushThreadBindings(RT.map(ARG_ENV, EMPTY_MAP)) rdr.back() form = read(rdr, True, None, True) drefed = ARG_ENV.deref() sargs = sorted(list(filter(lambda x: x != -1, drefed))) args = [] if len(sargs): for x in range(1, int(str(sargs[-1])) + 1): if x in drefed: args.append(drefed[x]) else: args.append(garg(x)) retsym = drefed[-1] if retsym is not None: args.append(_AMP_) args.append(retsym) vargs = RT.vector(*args) popThreadBindings() return RT.list(_FN_, vargs, form)
def requireClj(filename, stopafter="concat"): with open(filename) as fl: r = StringReader(fl.read()) RT.init() comp = Compiler() comp.setFile(filename) pushThreadBindings({currentCompiler: comp}) #o = open(filename+".cljc", "w") try: while True: EOF = object() s = read(r, False, EOF, True) if s is EOF: break #cPickle.dump(s, o) try: res = comp.compile(s) print s, res comp.executeCode(res) if stopafter is not None and hasattr(comp.getNS(), stopafter): break except Exception as exp: print s, filename raise except IOError as e: pass finally: popThreadBindings()
def fnReader(rdr, lparen): from clojure.lang.persistenthashmap import EMPTY from clojure.lang.var import popThreadBindings, pushThreadBindings if ARG_ENV.deref() is not None: raise IllegalStateException("Nested #()s are not allowed") pushThreadBindings(RT.map(ARG_ENV, EMPTY)) rdr.back() form = read(rdr, True, None, True) drefed = ARG_ENV.deref() sargs = sorted(list(filter(lambda x: x != -1, drefed))) args = [] if len(sargs): for x in range(1, int(str(sargs[-1])) + 1): if x in drefed: args.append(drefed[x]) else: args.append(garg(x)) retsym = drefed[-1] if retsym is not None: args.append(_AMP_) args.append(retsym) vargs = RT.vector(*args) popThreadBindings() return RT.list(_FN_, vargs, form)
def requireClj(filename, stopafter=None): with open(filename) as fl: r = StringReader(fl.read()) RT.init() comp = Compiler() comp.setFile(filename) pushThreadBindings({currentCompiler: comp}) #o = open(filename+".cljc", "w") try: while True: EOF = object() s = read(r, False, EOF, True) if s is EOF: break #cPickle.dump(s, o) try: res = comp.compile(s) comp.executeCode(res) if stopafter is not None: if hasattr(comp.getNS(), stopafter): break except Exception as exp: print s, filename raise except IOError as e: pass finally: popThreadBindings()
def __call__(self, r, backquote): pushThreadBindings(RT.map(GENSYM_ENV, EMPTY_MAP)) try: self.rdr = r form = read(r, True, None, True) return self.syntaxQuote(form) finally: popThreadBindings()
def executeCode(self, code): ns = self.getNS() if code == []: return None print(code) pushThreadBindings( {findItem(findOrCreateNamespace("clojure.core"), _NS_): ns}) retval = code.toFunc(ns.__dict__, filename = self.filename)() self.getNS().__file__ = self.filename popThreadBindings() return retval
def main(): RT.init() comp = Compiler() pushThreadBindings({currentCompiler: comp}) try: if not sys.argv[1:]: import clojure.repl clojure.repl.enable_readline() clojure.repl.run_repl(comp) else: for x in sys.argv[1:]: if x.endswith('.clj'): requireClj(x) finally: popThreadBindings()