Seguinte: Âmbito Dinâmico Acima: Modelo de Ambientes Anterior: Modelo de Ambientes
Índice remissivo

Âmbito Léxico

A regra de avaliação de variáveis em ambientes diz que o valor de uma variável em relação a um ambiente é dado pela ligação dessa variável no primeiro enquadramento em que ela surja ao longo da sequência de enquadramentos que constituem esse ambiente. Se nenhum enquadramento possui uma ligação para essa variável ela diz-se não ligada. É um erro avaliar variáveis não ligadas.

Uma vez que os enquadramentos de um ambiente estão associados lexicamente às formas que os criaram, é possível determinar o âmbito de uma variável qualquer simplesmente observando o texto do programa.

Usando o modelo de avaliação em ambientes é muito fácil perceber o comportamento da forma especial let (que não é mais do que uma simplificação de uma lambda) e da forma especial setq. Cada let aumenta o ambiente em que é avaliado com um novo enquadramento, estabelecendo ligações para as suas variáveis. Quando se pretende saber o valor de uma variável percorre-se o ambiente, começando pelo primeiro enquadramento até se encontrar a ligação correspondente. Se ela não aparecer, vai-se passando de enquadramento em enquadramento até se atingir o ambiente global, e se aí também não existir nenhuma ligação para aquela variável é gerado um erro de variável não ligada. O setq altera o valor da variável que aparece estabelecida no enquadramento mais próximo do ponto onde o setq é avaliado. Se se atingir o ambiente global, e se aí também não existir nenhuma ligação para aquela variável, é criada essa ligação no ambiente global.

> (let ((x 10))
    (+ x y))
Error: Unbound variable: Y
> (setq y 20)
20
> (let ((x 10))
    (+ x y))
30

Como se vê pelo exemplo. A partir do momento em que se estabeleceu uma ligação no ambiente global para a variável y, já é possível avaliar aquele let apesar de ele fazer referência a uma variável livre. No entanto, a utilização da forma especial setq para criar variáveis globais é considerada pouca correcta e o compilador emitirá um aviso se encontrar uma destas formas de utilização. A utilização do setq deve ser restricta a modificações do valor de variáveis previamente estabelecidas.

As regras de avaliação do modelo de ambientes são, em tudo, equivalentes às do modelo clássico, excepto no que diz respeito à aplicação de funções.

No modelo de ambientes todas as funções possuem um ambiente associado, que corresponde àquele que existia quando a função foi definida. Quando se aplica uma função aos seus argumentos, cria-se um novo ambiente, cujo primeiro enquadramento contém as ligações dos parâmetros formais da função aos seus argumentos e cujo ambiente envolvente é aquele em que a função foi definida. É em relação a este novo ambiente que se avalia o corpo da função.

Note-se que a forma especial defun define funções (i.e., cria uma ligação entre o nome da função e a lambda correspondente ao seu corpo) sempre no ambiente global, enquanto que setq altera a ligação de uma variável no primeiro enquadramento do ambiente em que a forma especial é avaliada. Só se a variável não for encontrada na sequência de enquadramentos é que o setq cria uma no ambiente global.

Exercício 62

Interprete o comportamento da seguinte função:

(let ((valor 0))
  (defun incrementa ()
     (setq valor (1+ valor))
     valor))

> (incrementa) 1 > (incrementa) 2 > (incrementa) 3

Resposta

É de salientar o carácter evolutivo da função incrementa. Na metodologia da programação funcional, o resultado de uma função só depende dos seus argumentos, e uma função sem argumentos equivale a uma constante. Sempre que a função é aplicada ela tem de devolver sempre o mesmo resultado. A partir do momento que se admite a atribuição, abre-se a porta a inúmeras possibilidades de violação do modelo funcional. As funções passam a ser caracterizadas por um estado local e o resultado da aplicação de uma função passa a depender não só dos argumentos mas também do estado local.

Exercício 63

Uma excelente aplicação de funções com estado local é na criação de geradores de sequências de números, i.e., funções sem argumentos que, a cada invocação, devolvem o elemento que sucede logicamente a todos os que foram gerados anteriormente. Seguindo este paradigma, defina o gerador da sequência de Fibonacci, que é representada pela sucessão crescente 1, 2, 3, 5, 8, ..., em que cada número é a soma dos dois últimos que o precedem.

Resposta

Exercício 64

Infelizmente, a função gera-fib não sabe recomeçar. Para isso, é necessário defini-la (compilá-la) outra vez. Este processo, como é lógico, é muito pouco práctico, em especial porque obriga o utilizador a ter acesso ao código do gerador. Complemente a definição da função gera-fib com uma outra função denominada repoe-fib que repõe o gerador em condições de recomeçar de novo desde o princípio.

Resposta


Seguinte: Âmbito Dinâmico Acima: Modelo de Ambientes Anterior: Modelo de Ambientes
Índice remissivo

Copyright António Leitão, 1995