Exemplos de Lazy com Escopo Dinâmico
Exemplo 1: Lazy Evaluation |
let var a = 1/0 in 2 |
Um exemplo típico de lazy evaluation, mostrando a postergação da avaliação da variável "a". Neste caso, a variável não precisou ser computada e o programa retorna o valor 2. Se esse exemplo fosse rodado com eager evaluation, o programa abortaria. |
Exemplo 2: Conflito entre escopos (variável local sobrescreve) |
let var a = 2, fun ret_a x = a, fun id x = (let var a = 0 in x) in id (ret_a(-1)) |
Apenas quando o corpo da função for avaliado é que a expressão ret_a(-1) será finalmente reduzida. Porém, a redução será feita considerando o novo identificador considerando o novo identificador a em escopo. |
Exemplo 3: Conflito entre escopos (parâmetro formal sobrescreve) |
let fun f a b = a + b in let var a = 2 in f (3,a) |
No momento da avaliação da chamada de função f(3,a), serão criados bindings de a na expressão 3 e de b para a expressão a. No momento em que expressão "a + b" for avaliada, o valor de b será reduzido para a. Nesse ponto do programa, o valor a será reduzido para 3 devido ao parâmetro formal a que sobrescreveu o a do escopo externo (de valor 2)." |
Exemplo 4: Loop infinito |
let fun f a b = a + b in let var a = 2, var b = 3 in f (b,a) |
O exemplo acima entra em loop infinito porque, ao aplicar a função "f (b,a)", a variável "a" recebe o valor da variável "b" (valor ainda não computado) e a variável "b" recebe o valor da variável "a". Com isso, ao computar os valores, o sistema tentará calcular o valor de "b", que é igual ao valor a ser computado de "a", que, por sua vez, é o valor a ser computado de "b" e assim ad infinitum, resultando num estouro da pilha. |