diff -r 0e25a9e25931 -r f2e4fdb3dd27 tests/test-highlight.t --- a/tests/test-highlight.t Sat Jul 06 21:48:07 2013 +0200 +++ b/tests/test-highlight.t Thu Jul 04 14:18:44 2013 +0400 @@ -137,39 +137,39 @@
+ #!/usr/bin/env python + + """Fun with generators. Corresponding Haskell implementation: + + primes = 2 : sieve [3, 5..] + where sieve (p:ns) = p : sieve [n | n <- ns, mod n p /= 0] + """ + + from itertools import dropwhile, ifilter, islice, count, chain + + def primes(): + """Generate all primes.""" + def sieve(ns): + p = ns.next() + # It is important to yield *here* in order to stop the + # infinite recursion. + yield p + ns = ifilter(lambda n: n % p != 0, ns) + for n in sieve(ns): + yield n + + odds = ifilter(lambda i: i % 2 == 1, count()) + return chain([2], sieve(dropwhile(lambda n: n < 3, odds))) + + if __name__ == "__main__": + import sys + try: + n = int(sys.argv[1]) + except (ValueError, IndexError): + n = 10 + p = primes() + print "The first %d primes: %s" % (n, list(islice(p, n)))