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 exemplo no 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.