Seguinte: Funções Locais Acima: Funções Anterior: Lambdas
Índice remissivo

Variáveis Locais

Imagine-se que pretendemos escrever uma função que calcula a seguinte expressão: tex2html_wrap_inline3374 . Em Lisp, temos a seguinte tradução:

(defun f (x y)
  (+ (* (quadrado (+ 1 (* (quadrado x) y))) x)
     (* (+ 1 (* (quadrado x) y)) y)))

Como se vê, a expressão (+ 1 (* (quadrado x) y)) aparece repetida duas vezes. Isto, para além de dificultar a leitura da função torna-a menos eficiente pois aquela expressão vai ter de ser calculada duas vezes.

Quase todas as linguagens de programação fornecem os meios para se criarem variáveis locais, temporárias, para guardarem resultados parciais que vão ser utilizados noutros sítios. Em Lisp, isso pode ser obtido definindo funções intermédias:

(defun f (x y)
  (f* x y (+ 1 (* (quadrado x) y))))

(defun f* (x y temp) (+ (* (quadrado temp) x) (* temp y)))

Mas como já vimos, não há necessidade de se definir uma função f* no ambiente pois podemos usar as lambdas directamente.

(defun f (x y)
  ((lambda (temp)
     (+ (* (quadrado temp) x)
        (* temp y)))
   (+ 1 (* (quadrado x) y))))

Repare-se que dentro do corpo da lambda há referências quer aos parâmetros da lambda (temp) quer aos parâmetros da função f em que a lambda está inserida.

Uma vez que não é muito conveniente separar os valores das variáveis, Lisp providencia uma forma especial designada let que é convertida para uma lambda. A sua sintaxe é:

(let ((var-1 exp-1)
       (var-2 exp-2)
             tex2html_wrap3298 
       (var-n exp-n))
   corpo)

Quando se avalia um let, cada símbolo var-i é associado ao valor da expressão correspondente exp-i (em paralelo) e em seguida o corpo é avaliado como se as referências a var-i estivessem substituidas pelos valores correspondentes de exp-i. Esta forma especial é absolutamente equivalente a escrever:

((lambda (var-1 var-2 ...var-n)
   corpo)
 exp-1exp-2 ...exp-n)

Embora equivalentes, a utilização da forma let é mais fácil de ler. Este género de formas especiais que se limitam a ser uma tradução mais agradável para outras formas especiais são designadas por açúcar sintático. O let é açucar sintático para uma lambda.

Exercício 26

Usando o let, reescreva a função f anterior.

Resposta

Exercício 27

Qual o valor das seguintes expressões:

Resposta


Seguinte: Funções Locais Acima: Funções Anterior: Lambdas
Índice remissivo

Copyright António Leitão, 1995