В различных Лиспах правильный список имеет либо 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 в python