aaronla
-
Python,
pasted
on Feb 10:
|
# first, some boilerplate
class Seq:
def __init__(self, defer):
self._defer = defer
def force(self):
if callable(self._defer):
self._defer=self._defer()
if isinstance(self._defer, Seq):
self._defer=self._defer.force()
return self._defer
def empty(self): return not self.force()
def hd(self): return self.force()[0]
def tl(self): return self.force()[1]
def __iter__(self):
x = self
while not x.empty():
yield x.hd()
x = x.tl()
def to_list(self): return list(self)
def take(self, n):
return Seq(lambda: None if (n==0 or self.empty()) else (self.hd(), self.tl().take(n-1)))
def drop(self, n):
return Seq(lambda: self if (n==0 or self.empty()) else self.tl().drop(n-1))
def cat(self, second):
return Seq(lambda: (self.hd(), self.tl().cat(second)) if not self.empty() else second)
empty = Seq(lambda:None)
def to_seq(value):
it = iter(value)
def more():
try: return (it.next(),Seq(more))
except StopIteration: return None
return Seq(more)
print "now, take it for a spin"
print "", to_seq([1,2,3]).to_list()
print "and now, a magic trick"
@Seq
def ones():
return (1, ones)
print "", ones.take(10).to_list()
print "and everybody's favorite exponential sequence"
def seq_sum(a, b):
return Seq(lambda: (a.hd()+b.hd(), seq_sum(a.tl(), b.tl())) if not a.empty() and not b.empty() else None)
@Seq
def zeros(): return (0, zeros)
@Seq
def fibonacci():
return Seq(lambda: to_seq([0, 1]).cat(
seq_sum(fibonacci,
fibonacci.drop(1))).force())
print "", fibonacci.take(20).to_list()
|
Output:
|
now, take it for a spin
[1, 2, 3]
and now, a magic trick
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
and everybody's favorite exponential sequence
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
|
|