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))
Exercício 30
Explique a seguinte função:
(defun incrementa (delta) (function (lambda (x) (+ x delta))))
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.