Como se viu pelo exemplo anterior, para que pudessemos
implementar em função de acumulatório tivemos
de escrever as funções pi/8-seguinte e pi/8-func, cuja
utilidade é muito limitada. Elas apenas servem para este
exemplo. Por esse motivo, não tem muito sentido estar a defini-las
no ambiente do avaliador. O que pretendiamos era tão somente
que fosse possível especificar as expressões que aquelas
funções calculam, independentemente do nome que se lhes
pudesse atribuir.
Para isso, a linguagem Lisp fornece as lambdas. Uma lambda é uma função com todas as características das restantes mas que não está associada a nenhum símbolo. Pode ser vista como uma função sem nome. A sintaxe da lambda é igual à da defun, mas em que se omite o nome.
> ((lambda (z) (+ z 3)) 2) 5
Como se vê, uma lambda pode ser usada onde
se usaria uma função. Isto permite simplificar o exercício
da aproximação a sem ter de definir quaisquer outras
funções:
(defun pi (n) (* 8 (soma (function (lambda (x) (/ 1.0 (* x (+ x 2))))) 1 (function (lambda (x) (+ x 4))) n)))
Exercício 25
Imagine uma função f ao longo de um intervalo [a,b]. Essa função deverá apresentar um máximo nesse intervalo, i.e., um valor entre a e b para o qual a função toma o seu valor máximo. Usando o acumulatório, escreva a função maximo-func que recebe uma função e um intervalo e encontra o máximo. Para determinar o maior entre dois número pode usar a função Lisp max. Teste maximo-func para o exemplono intervalo [0,2] com uma tolerância de 0.01.
As lambdas são a essência do Lisp. A qualquer função corresponde uma lambda. Na realidade, a forma especial defun não faz mais do que criar uma lambda com os parâmetros e o corpo da função e associá-la ao nome da função que se está a definir. Quando a forma especial function recebe um nome (um símbolo) ela devolve a lambda associada a esse nome.
A designação de lambda ( ) deriva duma
área da matemática que se dedica ao estudo dos conceitos
de função e de aplicação de função, e
que se designa por cálculo-
. O cálculo-
é uma ferramenta
muito utilizada para estudar a semântica das linguagens de
programação.
As lambdas possuem ainda muitas outras utilidades para além da mera criação de funções sem nome.