Python: lambdas aninhados - `s_push: estouro de pilha do analisador Erro de memória

Eu recentemente tropeceiEste artigo que descreve como codificar o FizzBuzz usando apenas Procs em Ruby, e como eu estava entediado, pensei que seria legal tentar implementar a mesma coisa em Python usando lambdas.

Cheguei à seção onde você cria números usando funções aninhadas e escrevi o seguinte script Python:

#!/usr/bin/env python

zero  = lambda p : (lambda x: x)
one   = lambda p : (lambda x: p(x))
two   = lambda p : (lambda x: p(p(x)))
three = lambda p : (lambda x: p(p(p(x))))
five  = lambda p: (lambda x: p(p(p(p(p(x))))))

fifteen = lambda p : (lambda x: p(p(p(p(p( \
                                p(p(p(p(p( \
                                p(p(p(p(p(x))))))))))))))))


hundred = lambda p: (lambda x: p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p(x)))))))))))))))))))))))))))) \
                                                     ))))))))))))))))))))))))))) \
                                                     ))))))))))))))))))))))))))) \
                                                     )))))))))))))))))))

def to_int(func):
    return func(lambda n: n + 1)(0)

print to_int(zero)
print to_int(one)
print to_int(two)
print to_int(three)
print to_int(five)
print to_int(fifteen)
print to_int(hundred)

Os números de zero a quinze funcionam bem, mas se eu tentar criar o número 100, o arquivo não será executado devido ao seguinte erro:

s_push: estouro de pilha do analisador
MemoryError

Eu tenho que comentar para que o arquivo seja executado.

Isso é uma droga - há alguma maneira de contornar essa limitação para que eu possa aninhar arbitrariamente lambdas e chamadas de função sem que o Python caia e fique sem memória?

Ou, alternativamente, existe algum tipo de truque de lambda-calculus que eu possa usar para expressar o número 100 sem ter tantas funções aninhadas?

questionAnswers(3)

yourAnswerToTheQuestion