Introdução
Introduzido originalmente como demonstração do poder da lazy evaluation nas linguagens funcionais nos anos 80, os programas circulares são considerados como uma técnica poderosa, concisa, eficiente e elegante para resolver um particular tipo de problema. Se um algoritmo tiver de percorrer uma estrutura de dados várias vezes, numa linguagem de avaliação atrasada, o mesmo poderá ser expresso com uma única travessia.
Como o nome indica, programas circulares caracterizam-se por a sua definição ter uma aparência circular, isto é, um dos argumentos de uma função depende de um dos argumentos que a mesma função retorna x = f(x). Apesar de um programa circular, numa linguagem com strict evaluation nunca irá terminar, enquanto que numa linguagem lazy às vezes conseguirá terminar. A avaliação atrasada irá sempre obter a ordem correcta de processamento, se essa ordem de facto existir. Assim, a função f pela sua definição será virtualmente circular, já que no momento da sua avaliação irá ser decomposta em não circular.