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.