def get_sexpr(self, source=None): if source: self.raw_source = source self.length = len(self.raw_source) self.index = 0 token = self.get_token() expr = None if token == ')': raise ValueError("Unexpected right paren") elif token == '(': expr = [] token = self.get_token() while token != ')': if token == '(': # Start parsing again. self.prev() expr.append(self.get_sexpr()) elif token == None: raise ValueError("Invalid end of expression: ", self.raw_source) else: expr.append(token) token = self.get_token() return List(expr) else: return token
class Symbol(Atom): def __init__(self, symbol): super(Symbol, self).__init__(symbol) def __repr__(self): return self.data def __hash__(self): return hash(self.data) def eval(self, env, args=None): return env.get(self.data) TRUE = Symbol('#t') FALSE = List() class String(Atom, Sequence): def __init__(self, str): Atom.__init__(self, str) def __repr__(self): return repr(self.data) def eval(self, env, args=None): return self def cons(self, e): if e.__class__ != self.__class__ and e.__class__ != Symbol.__class__: raise UnimplementedFunctionError('Cannot cons a string and a ',
def cons(self, e): ret = List(self.data[:]) # bugfix 1234977437 ret.data.insert(0, e) return ret
def test_falsiness(self): self.assertEquals(FALSE, List())
def cdr(self): try: return List(self.data[1:]) except: return List([])