예제 #1
0
파일: codegen.py 프로젝트: TheBB/Paltry
def _codegen_cons(node, bld, mod, lib, ns):
    if not bool(node):
        return _obj_ptr(bld, PtObject.nil)
    head, tail = node.car, node.cdr
    if head == PtObject.intern('quote'):
        return codegen_copy(tail.car, bld, mod, lib, ns)
    if head == PtObject.intern('begin'):
        nodes = list(tail) or [PtObject.nil]
        for node in nodes:
            retval = codegen(node, bld, mod, lib, ns)
        return retval
    if head == PtObject.intern('if'):
        return _codegen_if(tail, bld, mod, lib, ns)
    if head == PtObject.intern('let'):
        return _codegen_let(tail, bld, mod, lib, ns)
    return _codegen_funcall(node, bld, mod, lib, ns)
예제 #2
0
def test_symbol():
    obj = PtObject.symbol('abc')
    assert str(obj) == 'abc'
    assert obj != PtObject.symbol('abc')

    obj = PtObject.intern('abc')
    assert obj != PtObject.symbol('abc')
    assert obj == PtObject.intern('abc')
    assert obj is PtObject.intern('abc')

    ns = {
        PtSymbol('a', 0): 'a',
        PtSymbol('b', 1): 'b',
    }
    assert ns[PtSymbol('a', 0)] == 'a'
    assert ns[PtSymbol('a', 1)] == 'b'
    assert ns[PtSymbol('b', 0)] == 'a'
예제 #3
0
파일: parser.py 프로젝트: TheBB/Paltry
 def sexp(self, elements):
     if len(elements) > 1 and elements[-2] == PtObject.intern('.'):
         assert len(elements) > 2
         final = elements[-1]
         elements = elements[:-2]
     else:
         final = PtObject.nil
     return PtObject.list(elements, final)
예제 #4
0
def test_quote():
    check_result("'symbol", PtObject.intern('symbol'))
    check_result(
        "''symbol",
        PtObject.list([PtObject.intern('quote'),
                       PtObject.intern('symbol')]))
    check_result("'(a b c)",
                 PtObject.list([PtObject.intern(s) for s in ['a', 'b', 'c']]))
    check_result("'(a . b)",
                 PtObject.cons(PtObject.intern('a'), PtObject.intern('b')))
    check_result(
        "'(a b . c)",
        PtObject.cons(
            PtObject.intern('a'),
            PtObject.cons(PtObject.intern('b'), PtObject.intern('c'))))
예제 #5
0
def test_cons():
    assert str(PtObject.nil) == 'nil'
    assert PtObject.nil == PtObject.nil

    obj = PtObject.cons(PtObject.intern('def'), PtObject.intern('ghi'))
    assert str(obj) == '(def . ghi)'
    assert obj == PtObject.cons(PtObject.intern('def'), PtObject.intern('ghi'))
    assert obj != PtObject.cons(PtObject.symbol('def'), PtObject.intern('ghi'))
    assert obj != PtObject.cons(PtObject.intern('def'), PtObject.symbol('ghi'))

    obj = PtObject.cons(
        PtObject.intern('a'),
        PtObject.cons(
            PtObject.intern('b'),
            PtObject.cons(
                PtObject.intern('c'),
                PtObject.intern('d'))))
    assert str(obj) == '(a b c . d)'
    assert obj == PtObject.cons(
        PtObject.intern('a'),
        PtObject.cons(
            PtObject.intern('b'),
            PtObject.cons(
                PtObject.intern('c'),
                PtObject.intern('d'))))

    obj = PtObject.cons(
        PtObject.intern('a'),
        PtObject.cons(
            PtObject.intern('b'),
            PtObject.cons(
                PtObject.intern('c'),
                PtObject.nil)))
    assert str(obj) == '(a b c)'
    assert obj == PtObject.cons(
        PtObject.intern('a'),
        PtObject.cons(
            PtObject.intern('b'),
            PtObject.cons(
                PtObject.intern('c'),
                PtObject.nil)))

    obj = PtObject.list([
        PtObject.intern('a'),
        PtObject.intern('b'),
        PtObject.intern('c'),
        PtObject.intern('d'),
        PtObject.intern('e'),
    ])
    assert str(obj) == '(a b c d e)'
    assert obj == PtObject.list([
        PtObject.intern('a'),
        PtObject.intern('b'),
        PtObject.intern('c'),
        PtObject.intern('d'),
        PtObject.intern('e'),
    ])
예제 #6
0
파일: parser.py 프로젝트: TheBB/Paltry
 def symbol(self, name):
     return PtObject.intern(name)
예제 #7
0
파일: parser.py 프로젝트: TheBB/Paltry
 def unquot_splice(self, value):
     return PtObject.list([PtObject.intern('unquote-splice'), value])
예제 #8
0
파일: parser.py 프로젝트: TheBB/Paltry
 def unquot(self, value):
     return PtObject.list([PtObject.intern('unquote'), value])
예제 #9
0
파일: parser.py 프로젝트: TheBB/Paltry
 def bquot(self, value):
     return PtObject.list([PtObject.intern('backquote'), value])
예제 #10
0
def test_runtime():
    check_result('(intern "alpha")', PtObject.intern('alpha'))
예제 #11
0
def test_parsing():
    parser = PaltryParser(semantics=PaltrySemantics())
    parse = lambda s: parser.parse(s, 'exp')

    assert parse('quux') == PtObject.intern('quux')
    assert parse('"alpha"') == PtObject('alpha')
    assert parse('""') == PtObject('')
    assert parse('120') == PtObject(120)
    assert parse('-2') == PtObject(-2)
    assert parse('120.0e1') == PtObject(1200.0)
    assert parse('-3.14') == PtObject(-3.14)
    assert parse('0xf') == PtObject(15)
    assert parse('-0xf') == PtObject(-15)
    assert parse('0o7') == PtObject(7)
    assert parse('-0o7') == PtObject(-7)
    assert parse('0b1') == PtObject(1)
    assert parse('-0b1') == PtObject(-1)
    assert parse('(a b c d "e")') == PtObject.list([
        PtObject.intern('a'),
        PtObject.intern('b'),
        PtObject.intern('c'),
        PtObject.intern('d'),
        PtObject('e'),
    ])
    assert parse("'quoted") == PtObject.list(
        [PtObject.intern('quote'),
         PtObject.intern('quoted')])
    assert parse("'(a list goes here)") == PtObject.list([
        PtObject.intern('quote'),
        PtObject.list([
            PtObject.intern('a'),
            PtObject.intern('list'),
            PtObject.intern('goes'),
            PtObject.intern('here'),
        ]),
    ])
    assert parse('`(a list goes here)') == PtObject.list([
        PtObject.intern('backquote'),
        PtObject.list([
            PtObject.intern('a'),
            PtObject.intern('list'),
            PtObject.intern('goes'),
            PtObject.intern('here'),
        ]),
    ])
    assert parse(',sym') == PtObject.list([
        PtObject.intern('unquote'),
        PtObject.intern('sym'),
    ])
    assert parse(',(a b)') == PtObject.list([
        PtObject.intern('unquote'),
        PtObject.list([
            PtObject.intern('a'),
            PtObject.intern('b'),
        ])
    ])
    assert parse(',@sym') == PtObject.list([
        PtObject.intern('unquote-splice'),
        PtObject.intern('sym'),
    ])
    assert parse(',@(a b)') == PtObject.list([
        PtObject.intern('unquote-splice'),
        PtObject.list([
            PtObject.intern('a'),
            PtObject.intern('b'),
        ])
    ])
예제 #12
0
파일: runtime.py 프로젝트: TheBB/Paltry
def intern(name):
    return PtObject.intern(name.string)