Ich habe einen Text, den ich nacheinander in Token zerteile. Immer wenn ich nach dem nächsten Token frage, soll dieser berechnet werden. Ich möchte aber beliebig wieder zurückgehen können und alte Token nochmals erfragen, ohne das sie erneut berechnet werden.
Clojure kennt mit `ISeq` einen funktionalen Iterator, der diese Anforderung erfüllt.
Hier ist eine Implementierung in Python:
Code: Alles auswählen
class Seq(object):
def __init__(self, first, restfun):
self.first, self.restfun, self.restval = first, restfun, self
@property
def rest(self):
if self.restval is self:
self.restval = self.restfun()
return self.restval
Code: Alles auswählen
def take(n, coll):
if n > 0:
return Seq(coll.first, lambda: take(n - 1, coll.rest))
Code: Alles auswählen
def seq(sequence):
i = iter(sequence)
def next():
try:
return Seq(i.next(), next)
except StopIteration:
return None
return next()
Stefan