在各种 Lisps 中,正确的列表是nil
(空值)或cons单元格,其中第一个(head,first,car)值指向一个值,第二个(tail,rest,cdr)指向另一个正确的列表。其他各种函数式编程语言都实现了这种头尾功能,包括 Erlang 和 Scala。在 Common Lisp 和 Emacs Lisp 中,您可以无限递归地找到列表的尾部:
(rest (rest (rest (rest (rest (rest ()))))))
它会产生nil
。我想在 Python 中模拟这种行为。当然,为了性能,我最好坚持使用经过大量优化的本机数据类型,所以这只是为了练习。我的代码是:
class MyList:
def __init__(self, *xs):
self._x = []
self._x.extend(xs)
self.is_empty = not xs
self.head = xs[0] if xs else None
self.tail = MyList(*xs[1:]) if xs[1:] else MyList([])
但是,现在调用tail
会进入递归并导致最大递归深度错误。我怎样才能使如下表达式成为可能?换句话说,我如何在 Python 中创建适当列表的功能?
a = MyList(1,2)
my_list.tail.tail.tail.tail.tail.tail
相关问题,但没有回答我的问题:LISP cons in python