Пример #1
0
def matchSymbol(s):
    """Return a symbol or keyword.

    Return None if the string s does not define a legal symbol or keyword."""
    m = symbolPat.match(s)
    if m is not None:
        ns = m.group(1)
        name = m.group(2)

        if name.endswith(".") and not name.startswith("."):
            name = name[:-1]
        if ns is not None and (ns.endswith(":/") or name.endswith(":")\
            or s.find("::") != -1):
                return None
        ns = ns if ns is None else ns[:-1]
        
        if s.startswith("::"):
            return keyword(currentNSName(), s[2:])


        iskeyword = s.startswith(':')
        if iskeyword:
            return keyword(s[1:])
        else:
            return symbol(ns, name)
    return None
Пример #2
0
def matchSymbol(s):
    """Return a symbol or keyword.

    Return None if the string s does not define a legal symbol or keyword."""
    m = symbolPat.match(s)
    if m is not None:
        ns = m.group(1)
        name = m.group(2)

        if name.endswith(".") and not name.startswith("."):
            name = name[:-1]
        if ns is not None and (ns.endswith(":/") or name.endswith(":")\
            or s.find("::") != -1):
            return None
        ns = ns if ns is None else ns[:-1]

        if s.startswith("::"):
            return keyword(currentNSName(), s[2:])

        iskeyword = s.startswith(':')
        if iskeyword:
            return keyword(s[1:])
        else:
            return symbol(ns, name)
    return None
Пример #3
0
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
Пример #4
0
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
Пример #5
0
def matchSymbol(s):
    from clojure.lang.symbol import Symbol
    from 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(ns, name[(1 if iskeyword else 0):])
        if iskeyword:
            return keyword(s)
        else:
            return sym
    return None
Пример #6
0
from clojure.lang.ipersistentlist import IPersistentList
from clojure.lang.iseq import ISeq
from clojure.lang.lispreader import _AMP_, LINE_KEY, garg
from clojure.lang.namespace import (findItem,
                                    find as findNamespace,
                                    findOrCreate as findOrCreateNamespace)
from clojure.lang.persistentlist import PersistentList, EmptyList
from clojure.lang.persistentvector import PersistentVector
import clojure.lang.rt as RT
from clojure.lang.symbol import Symbol, symbol
from clojure.lang.var import Var, define, intern as internVar, var as createVar
from clojure.util.byteplay import *
import clojure.util.byteplay as byteplay
import marshal

_MACRO_ = keyword(symbol("macro"))
version = (sys.version_info[0] * 10) + sys.version_info[1]

PTR_MODE_GLOBAL = "PTR_MODE_GLOBAL"
PTR_MODE_DEREF = "PTR_MODE_DEREF"

AUDIT_CONSTS = False

class MetaBytecode(object):
    pass


class GlobalPtr(MetaBytecode):
    def __init__(self, ns, name):
        self.ns = ns
        self.name = name
Пример #7
0
from clojure.lang.cljkeyword import keyword

default = keyword("default")

class MultiMethodException(Exception):
    def __init__(self, reason):
        Exception.__init__(self, reason)

class MultiMethod(object):
    def __init__(self, selector):
        self.selector = selector
        self.fns = {}
        self.default = None
        
    def addMethod(self, value, fn):
        if value in self.fns:
            raise MultiMethodException("Method already exists for value {0}".format(value))
        if value == default and self.default is not none:
            raise MultiMethodException("Method already exists for value {0}".format(value))

        if value == default:
            self.default = fn
        else:
            self.fns[value]
            
    def __call__(self, *args):
        dval = self.selector(*args)
        
        try:
            fn = self.fns[dval]
        except KeyError:
Пример #8
0
from clojure.lang.aref import ARef
from clojure.lang.cljexceptions import (ArityException,
                                           InvalidArgumentException,
                                           IllegalStateException)
from clojure.lang.persistenthashmap import EMPTY
from clojure.lang.threadutil import ThreadLocal, currentThread
from clojure.lang.symbol import symbol
from clojure.lang.cljkeyword import keyword
from clojure.lang.iprintable import IPrintable

from clojure.lang.atomicreference import AtomicReference

import persistentarraymap
import types

privateKey = keyword(symbol("private"))
macrokey = keyword(symbol("macro"))
STATIC_KEY = keyword(symbol("static"))
dvals = ThreadLocal()
privateMeta = persistentarraymap.create([privateKey, True])
UKNOWN = symbol("UNKNOWN")


def pushThreadBindings(bindings):
    f = dvals.get(lambda: Frame())
    bmap = f.bindings
    for v in bindings:
        value = bindings[v]
        if not v.dynamic:
            raise IllegalStateException("Can't dynamically bind non-dynamic "
                                        "var: " + str(v.ns) + "/"
Пример #9
0
from clojure.lang.aref import ARef
from clojure.lang.cljexceptions import (ArityException,
                                        InvalidArgumentException,
                                        IllegalStateException)
from clojure.lang.persistenthashmap import EMPTY
from clojure.lang.threadutil import ThreadLocal, currentThread
from clojure.lang.symbol import symbol
from clojure.lang.cljkeyword import keyword
from clojure.lang.iprintable import IPrintable

from clojure.lang.atomicreference import AtomicReference

import persistentarraymap
import types

privateKey = keyword(symbol("private"))
macrokey = keyword(symbol("macro"))
STATIC_KEY = keyword(symbol("static"))
dvals = ThreadLocal()
privateMeta = persistentarraymap.create([privateKey, True])
UKNOWN = symbol("UNKNOWN")


def pushThreadBindings(bindings):
    f = dvals.get(lambda: Frame())
    bmap = f.bindings
    for v in bindings:
        value = bindings[v]
        if not v.dynamic:
            raise IllegalStateException("Can't dynamically bind non-dynamic "
                                        "var: " + str(v.ns) + "/" + str(v.sym))
Пример #10
0
from clojure.lang.ipersistentlist import IPersistentList
from clojure.lang.var import Var, define, intern as internVar, var as createVar
from clojure.util.byteplay import *
import clojure.util.byteplay as byteplay
from clojure.lang.cljkeyword import Keyword, keyword
from clojure.lang.namespace import find as findNamespace
import new
import clojure.lang.rt as RT
from clojure.lang.lispreader import _AMP_
from clojure.lang.namespace import findItem
from clojure.lang.lispreader import LINE_KEY, garg
import re
import new
import sys

_MACRO_ = keyword(symbol(":macro"))
version = (sys.version_info[0] * 10) + sys.version_info[1]


def emitJump(label):
    if version == 26:
        return [(JUMP_IF_FALSE, label), (POP_TOP, None)]
    else:
        return [(POP_JUMP_IF_FALSE, label)]


def emitLanding(label):
    if version == 26:
        return [(label, None), (POP_TOP, None)]
    else:
        return [(label, None)]
Пример #11
0
from clojure.lang.iref import IRef
from clojure.lang.ifn import IFn
from clojure.lang.settable import Settable
from clojure.lang.aref import ARef
from clojure.lang.cljexceptions import (ArityException,
                                           InvalidArgumentException,
                                           IllegalStateException)
from clojure.lang.persistenthashmap import EMPTY
from clojure.lang.threadutil import ThreadLocal, currentThread
from clojure.lang.symbol import symbol
from clojure.lang.cljkeyword import keyword
import persistentarraymap

privateKey = keyword(symbol("private"))
macrokey = keyword(symbol(":macro"))
dvals = ThreadLocal()
privateMeta = persistentarraymap.create([privateKey, True])
UKNOWN = symbol("UNKNOWN")


def pushThreadBindings(bindings):
    f = dvals.get(lambda: 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))
Пример #12
0
from clojure.lang.cljkeyword import keyword

default = keyword("default")

class MultiMethodException(Exception):
    def __init__(self, reason):
        Exception.__init__(self, reason)

class MultiMethod(object):
    def __init__(self, selector):
        self.selector = selector
        self.fns = {}
        self.default = None
        
    def addMethod(self, value, fn):
        if value in self.fns:
            raise MultiMethodException("Method already exists for value " + str(value))
        if value == default and self.default is not none:
            raise MultiMethodException("Method already exists for value " + str(value))

        if value == default:
            self.default = fn
        else:
            self.fns[value]
            
    def __call__(self, *args):
        dval = self.selector(*args)
        
        try:
            fn = self.fns[dval]
        except KeyError:
Пример #13
0
def mapTest(ns, var):
    print "mapping ", ns, var
    class Test(unittest.TestCase):
        def testVar(self):
            var()
    
    name = ns + str(var)
    tst = Test
    tst.__name__ = name
    globals()[name] = tst
            

for x in os.listdir(os.path.dirname(__file__)):
    if x.endswith(".clj") and x.find("test") >= 0:
        print "Reading tests from",  x
        requireClj(os.path.join(os.path.dirname(__file__),x))
        folder, file = os.path.split(x)
        ns, ext = os.path.splitext(x)
        module = sys.modules["tests."+ns]
        
        for idx in dir(module):
            var = getattr(module, idx)
            print type(var), var
            if isinstance(var, Var) and str(var).endswith("tests"):
                meta = var.meta()
                if meta is not None and meta[keyword("test")]:
                    mapTest(ns, var) 
                    

Пример #14
0
import clojure.core


def mapTest(ns, var):
    class Test(unittest.TestCase):
        def testVar(self):
            var()
    
    name = ns + str(var)
    tst = Test
    tst.__name__ = name
    globals()[name] = tst
            

for x in os.listdir(os.path.dirname(__file__)):
    if x.endswith(".clj") and x.find("test") >= 0:
        print "Reading tests from",  x
        requireClj(os.path.join(os.path.dirname(__file__),x))
        folder, file = os.path.split(x)
        ns, ext = os.path.splitext(x)
        module = sys.modules["tests."+ns]
        
        for idx in dir(module):
            var = getattr(module, idx)
            if isinstance(var, Var) and str(var).endswith("tests"):
                meta = var.meta()
                if meta is not None and meta[keyword("test")]:
                    mapTest(ns, var)