Seguinte: Duração de uma Referência Acima: Âmbito e Duração Anterior: Âmbito e Duração
Índice remissivo

Âmbito de uma Referência

Designa-se por âmbito de uma referência, a zona textual em que ela pode ser correctamente referida. Assim, o âmbito de um parâmetro de uma lambda é a zona textual correspondente ao corpo da função. Isto implica que qualquer parâmetro da lambda pode ser referido dentro desse corpo, mas não fora dele.

> ((lambda (z) (+ z z)) 3)
6
> (+ z z)
Error: Unbound variable Z

Uma vez que o âmbito de um parâmetro é o corpo da lambda correspondente, é possível escrever:

> ((lambda (z) ((lambda (w) (+ w z)) 3) 4)
7

Reescrevendo o exemplo usando o let, temos

> (let ((z 4))
    (let ((w 3))
      (+ w z)))
7

Neste exemplo, cada lambda (ou cada let) estabelece um valor para uma variável. Quando se encontra uma referência a uma variável, o seu valor é dado pela ligação correspondente ao contexto mais pequeno. Se não existe qualquer ligação em nenhum dos contextos, a variável diz-se não ligada. A avaliação de variáveis não ligadas produz um erro.

Quando uma mesma variável aparece ligada repetidamente em contextos sucessivos, a ligação mais ``interior'' obscurece todas as ``exteriores''. Isto não quer dizer que as ligações exteriores sejam destruídas. Elas são apenas localmente substituídas durante a avaliação do corpo mais interior. Assim, temos o seguinte exemplo:

> (let ((x 10))
    (+ (let ((x 20))
         x)
       x))
30

Diz-se que uma referência é de âmbito léxico quando ela só pode ser correctamente referida dentro da região textual da expressão que a criou.

Diz-se que uma referência é de âmbito vago (ou indefinido) quando ela pode ser correctamente referida a partir de qualquer região do programa.

Exercício 28

Que tipo de âmbito possui uma variável de um let? Que tipo de âmbito possui o nome de uma função?

Resposta



Copyright António Leitão, 1995