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'), ])
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'))))
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)
def unquot_splice(self, value): return PtObject.list([PtObject.intern('unquote-splice'), value])
def unquot(self, value): return PtObject.list([PtObject.intern('unquote'), value])
def bquot(self, value): return PtObject.list([PtObject.intern('backquote'), value])
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'), ]) ])