0%
Pular para o conteúdo principal
0%

3.2 O Modelo de Ambiente de Avaliação

Quando introduzimos funções compostas no capítulo 1, usamos o modelo de substituição de avaliação (seção 1.1.5) para definir o que significa aplicar uma função a argumentos:

  • Para aplicar uma função composta a argumentos, avalie a expressão de retorno da função (mais geralmente, o corpo) com cada parâmetro substituído pelo argumento correspondente.

Uma vez que admitimos atribuição em nossa linguagem de programação, tal definição não é mais adequada. Em particular, a seção 3.1.3 argumentou que, na presença de atribuição, um nome não pode ser considerado meramente como representando um valor. Em vez disso, um nome deve de alguma forma designar um "lugar" no qual valores podem ser armazenados. Em nosso novo modelo de avaliação, esses lugares serão mantidos em estruturas chamadas ambientes.

Um ambiente é uma sequência de quadros. Cada quadro é uma tabela (possivelmente vazia) de vinculações, que associam nomes aos seus valores correspondentes. (Um único quadro pode conter no máximo uma vinculação para qualquer nome.) Cada quadro também tem um ponteiro para seu ambiente envolvente, a menos que, para fins de discussão, o quadro seja considerado global. O valor de um nome com respeito a um ambiente é o valor dado pela vinculação do nome no primeiro quadro no ambiente que contém uma vinculação para esse nome. Se nenhum quadro na sequência especificar uma vinculação para o nome, então o nome é dito estar não vinculado no ambiente.

A simple environment structure

Figura 3.1: Uma estrutura de ambiente simples.

A Figura 3.1 mostra uma estrutura de ambiente simples consistindo de três quadros, rotulados I, II e III. No diagrama, A, B, C e D são ponteiros para ambientes. C e D apontam para o mesmo ambiente. Os nomes z e x estão vinculados no quadro II, enquanto y e x estão vinculados no quadro I. O valor de x no ambiente D é 3. O valor de x com respeito ao ambiente B também é 3. Isso é determinado da seguinte forma: examinamos o primeiro quadro na sequência (quadro III) e não encontramos uma vinculação para x, então procedemos para o ambiente envolvente D e encontramos a vinculação no quadro I. Por outro lado, o valor de x no ambiente A é 7, porque o primeiro quadro na sequência (quadro II) contém uma vinculação de x para 7. Com respeito ao ambiente A, a vinculação de x para 7 no quadro II é dita ocultar a vinculação de x para 3 no quadro I.

O ambiente é crucial para o processo de avaliação, porque determina o contexto no qual uma expressão deve ser avaliada. De fato, pode-se dizer que expressões em uma linguagem de programação não têm, em si mesmas, qualquer significado. Em vez disso, uma expressão adquire significado apenas com respeito a algum ambiente no qual é avaliada. Mesmo a interpretação de uma expressão tão simples quanto display(1) depende de um entendimento de que se está operando em um contexto no qual o nome display se refere à função primitiva que exibe um valor.

Assim, em nosso modelo de avaliação sempre falaremos de avaliar uma expressão com respeito a algum ambiente. Para descrever interações com o interpretador, suporemos que existe um ambiente global, consistindo de um único quadro (sem ambiente envolvente) que inclui valores para os nomes associados às funções primitivas. Por exemplo, a ideia de que display é o nome para a função primitiva de exibição é capturada dizendo que o nome display está vinculado no ambiente global à função primitiva display.

Antes de avaliarmos um programa, estendemos o ambiente global com um novo quadro, o quadro do programa, resultando no ambiente do programa. Adicionaremos os nomes que são declarados no nível superior do programa, fora de qualquer bloco, a este quadro. O programa dado é então avaliado com respeito ao ambiente do programa.