Exemplo n.º 1
0
Arquivo: lists.py Projeto: uxmal/idc
def extend(head, tail):
    '''Return the concatenation of two list terms.'''
    if types.isNil(head):
        return tail
    if types.isNil(tail):
        return head
    factory = tail.factory
    for elm in reversed(head):
        tail = factory.makeCons(elm, tail)
    return tail
Exemplo n.º 2
0
Arquivo: lists.py Projeto: uxmal/idc
def length(term):
    '''Length of a list term.'''
    length = 0
    while not types.isNil(term):
        assert types.isCons(term)
        length += 1
        term = term.tail
    return length
Exemplo n.º 3
0
Arquivo: path.py Projeto: uxmal/idc
 def fromTerm(cls, trm):
     res = []
     tail = trm
     while not types.isNil(tail):
         if not types.isCons(tail):
             raise ValueError('bad path', trm)
         idx = tail.head
         if not types.isInt(idx):
             raise ValueError('bad index', idx)
         res.append(idx.value)
         tail = tail.tail
     res.reverse()
     return cls(res)
Exemplo n.º 4
0
Arquivo: lists.py Projeto: uxmal/idc
def item(term, index):
    '''Get item at given index of a list term.'''
    if index < 0:
        raise IndexError('index out of bounds')
    while True:
        if types.isNil(term):
            raise IndexError('index out of bounds')
        if not types.isCons(term):
            raise TypeError('not a list term', term)
        if index == 0:
            return term.head
        index -= 1
        term = term.tail
Exemplo n.º 5
0
Arquivo: lists.py Projeto: uxmal/idc
def empty(term):
    '''Whether a list term is empty or not.'''
    return types.isNil(term)