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

Duração de uma Referência

Designa-se por duração de uma referência o intervalo de tempo durante o qual ela pode ser correctamente referida.

Diz-se que uma referência é de duração dinâmica quando só pode ser correctamente referida no intervalo de tempo que decorre durante a avaliação da expressão que a criou.

Diz-se que uma referência é de duração vaga (ou indefinida) quando pode ser correctamente referida em qualquer instante após a avaliação da expressão que a criou.

Em Pascal, os parâmetros de uma função ou procedimento têm âmbito léxico e duração dinâmica. A ligação dos parâmetros formais aos parâmetros actuais existe apenas durante a execução da função ou procedimento.

Em Scheme ou Common Lisp, os parâmetros das lambdas têm âmbito léxico e duração vaga. Isto implica que é possível aceder a uma variável mesmo depois de a função que a criou ter terminado, desde que essa variável seja acedida dentro da região textual dessa função.

A título de exemplo, se tentarmos escrever a função que determina o máximo de uma função numérica mas de forma a que ela possa receber uma tolerância como parâmetro, podemos ser conduzidos a qualquer coisa do género:

(defun maximo-func (func a b tol)
  (acumulatorio (function max)
                func
                (funcall func a)
                a
                (function (lambda (x) (+ x tol)))
                b))

Repare-se que neste exemplo a função que estabelece o incremento refere-se à variável livre tol. Uma das capacidades fundamentais das lambdas é a sua referência a variáveis livres. Uma variável diz-se livre numa lambda quando não é um dos parâmetros da lambda onde é referida.

Quando se aplica uma lambda aos seus argumentos, os parâmetros tomam como valor os argumentos correspondentes, enquanto que as variáveis livres tomam como valor o valor da primeira variável igual no contexto em que a lambda é definida. É por esse motivo que quando a lambda que realiza o incremento é aplicada a um número, ela sabe qual o valor correcto de tol. Ele é dado pelo contexto léxico (i.e. textual) em que a lambda foi definida.

Exercício 29

Analise os seguintes casos:

((lambda (x) (+ x y)) 10)
(let ((y 5)) ((lambda (x) (+ x y)) 10))

Resposta

Exercício 30

Explique a seguinte função:

(defun incrementa (delta)
  (function (lambda (x) (+ x delta))))

Resposta

Exercício 31

Use a função incrementa para reescrever a função que determina o máximo de uma função numérica--maximo-func.

Resposta


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

Copyright António Leitão, 1995