コード例 #1
0
ファイル: reader.py プロジェクト: threepointone/lithp
    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
コード例 #2
0
ファイル: atom.py プロジェクト: wangfuli217/study
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 ',
コード例 #3
0
 def cons(self, e):
     ret = List(self.data[:]) # bugfix 1234977437
     ret.data.insert(0, e)
     return ret
コード例 #4
0
 def test_falsiness(self):
     self.assertEquals(FALSE, List())
コード例 #5
0
 def cdr(self):
     try:
         return List(self.data[1:])
     except:
         return List([])