Seguinte: Âmbito e Duração Acima: Funções Anterior: Variáveis Locais
Índice remissivo

Funções Locais

Tal como se podem criar variáveis locais com a forma especial let, também é possível criar funções locais com a forma especial flet. A sua sintaxe é extremamente parecida com a do let, só que o valor de cada variável é a definição de uma função.

A título de exemplo, estude-se a seguinte definição:

(defun teste (x)
   (flet ((f-local1 (y) (+ x y))
          (f-local2 (z) (* x z))
          (f-local3 (x) (+ x 2)))
     (+ (f-local1 x) (f-local2 x) (f-local3 x))))

> (teste 2) 12 > (f-local1 2) Error: Undefined function F-LOCAL1

As funções f-local1, f-local2 e f-local3 são locais à função teste, sendo estabelecidas a cada aplicação desta função. Tal como as variáveis do let, as funções locais de um flet não se podem referir umas às outras, pois são avaliadas em paralelo. Isto implica, também, que não se podem referir a si própias, impedindo a criação de funções locais recursivas.

Atendendo a que a maioria das vezes as funções que definimos são recursivas, independentemente de serem locais ou não, interessa possuir um meio de o podermos fazer. A forma especial labels providencia esta possibilidade. A sua sintaxe é igual à do flet, mas a sua semântica é ligeiramente diferente. Para o flet, o âmbito do nome das funções definidas é apenas o corpo do flet. Para o labels, esse âmbito é extendido à própria forma especial. Isto permite que se possam definir funções locais recursivas ou mutuamente recursivas.



Copyright António Leitão, 1995