codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
def main(): 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 fibonacci(): return Seq(lambda: to_seq([0, 1]).cat( seq_sum(fibonacci, fibonacci.drop(1))).force()) print "", fibonacci.take(20).to_list() # library code: 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) main()
Private
[
?
]
Run code
Submit