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?