
def is_palindrome(x):
    assert isinstance(x,str)
    return x == x[::-1]

def gen_primes():
    from __builtin__ import next
    from itertools import count, ifilter
    sieve = lambda prime,gen: ifilter(prime.__rmod__,gen)

    prime = 2
    gen = sieve(prime,count(start=3,step=2))

    while 1:
        yield prime
        prime = next(gen)
        gen = sieve(prime,gen)

if __name__ == '__main__':
    from itertools import islice,ifilter

    def _compose(f,g):
        "XXX: compose two functions which takes one argument."
        return lambda x:f(g(x))

    gen_palindrome_primes = ifilter(_compose(is_palindrome,str),gen_primes())
    for idx,num in enumerate(islice(gen_palindrome_primes,50),start=1):
        print idx,num
