さまざまなLispでは、適切なリストはnil
(null値)またはconsセルのいずれかであり、最初の(head、first、car)値は値を指し、2番目の(tail、rest、cdr)は別の適切なリストを指します。ErlangやScalaなど、他のさまざまな関数型プログラミング言語がこのヘッドアンドテール機能を実装しています。CommonLispとEmacsLispでは、リストの末尾を無限に再帰的に見つけることができます。
(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
関連する質問ですが、私の質問には答えません:PythonのLISPの短所