[ create a new paste ] login | about

Link: http://codepad.org/EcSakzlT    [ raw code | output | fork ]

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:
1
2
3
4
5
6
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]


Create a new paste based on this one


Comments: