コード例 #1
0
ファイル: compiler.py プロジェクト: redalastor/clojure-py
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
コード例 #2
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)
    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
コード例 #3
0
ファイル: compiler.py プロジェクト: drewr/clojure-py
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
コード例 #4
0
ファイル: compiler.py プロジェクト: frankyxhl/clojure-py
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
ファイル: compiler.py プロジェクト: aisk/clojure-py
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
コード例 #6
0
ファイル: repl.py プロジェクト: bymerej/clojure-py
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