def matchSymbol(s): from py.clojure.lang.symbol import Symbol from py.clojure.lang.cljkeyword import Keyword m = symbolPat.match(s) if m is not None: ns = m.group(1) name = m.group(2) if ns is not None and ns.endswith(":/") or name.endswith(":")\ or s.find("::") != -1: return None if s.startswith("::"): return "FIX" ns = ns if ns is None else ns[:-1] iskeyword = s.find(':') == 0 sym = Symbol.intern(ns, name[(1 if iskeyword else 0):]) if iskeyword: return Keyword.intern(s) else: return sym return None
from py.clojure.lang.iref import IRef from py.clojure.lang.ifn import IFn from py.clojure.lang.settable import Settable from py.clojure.lang.aref import ARef from py.clojure.lang.cljexceptions import ArityException, InvalidArgumentException, IllegalStateException from py.clojure.lang.persistenthashmap import EMPTY from py.clojure.lang.threadutil import ThreadLocal, synchronized, currentThread from py.clojure.lang.symbol import Symbol from py.clojure.lang.cljkeyword import Keyword from persistentarraymap import PersistentArrayMap privateKey = Keyword.intern(Symbol.intern("private")) macrokey = Keyword.intern(Symbol.intern(":macro")) dvals = ThreadLocal() privateMeta = PersistentArrayMap.create([privateKey, True]) UKNOWN = Symbol.intern("UNKNOWN") def pushThreadBindings(bindings): f = dvals.get(lambda: Var.Frame()) bmap = f.bindings bs = bindings.seq() while bs is not None: e = bs.first() v = e.getKey() if not v.dynamic: raise IllegalStateException("Can't dynamically bind non-dynamic var: " + str(v.ns) + "/" + str(v.sym)) v.validate(v.getValidator(), e.getValue()) v.threadBound = True bmap = bmap.assoc(v, Var.TBox(currentThread(), e.getValue())) bs = bs.next() dvals.set(Var.Frame(bmap, f))
from py.clojure.lang.ipersistentvector import IPersistentVector from py.clojure.lang.ipersistentmap import IPersistentMap from py.clojure.lang.ipersistentlist import IPersistentList from py.clojure.lang.var import Var from py.clojure.util.byteplay import * from py.clojure.lang.cljkeyword import Keyword import new import py.clojure.lang.rt as RT from py.clojure.lang.lispreader import _AMP_ from py.clojure.lang.namespace import findItem from py.clojure.lang.lispreader import LINE_KEY, garg import re import new _MACRO_ = Keyword.intern(Symbol.intern(":macro")) def compileNS(comp, form): rest = form.next() if len(rest) != 1: raise CompilerException("ns only supports one item", rest) comp.setNS(rest.first()) return [] 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