Closures – fechamento de escopo léxico

O que é isso e para que serve?

Tentarei responder o mais claro possível.

Como Prisma, na verdade, é uma modificação dos fontes Lua 5.2, ela herda vários traços positivos e negativos da sua linguagem base. Um ponto positivo é a questão dos closures.

Lembra que em Prisma até mesmo as funções são variáveis e com elas podemos fazer praticamente o mesmo que fazemos com as outras variáveis: podemos passar funções como argumentos para outras funções, podemos reatribuir funções em outra variável, podemos retornar funções de dentro de outras funções. É esse último aspecto que quero ressaltar aqui.

Closure nada mais é do que você criar uma função dentro de outra função e assim a função interna mantém seu escopo léxico fechado. Isso significa que as variáveis locais sempre poderão ser acessadas pela função interna, mesmo fora da função externa.

Para entender melhor vejamos um simples exemplo, vamos criar um contador:

 

Criamos a função externa: contador();

Criamos a variável local i dentro da função contador();

 

Retornamos da função contador uma outra função, note que não damos nome à função retornada, e nem precisa já que ela será atribuída a uma variável. A função sem nome é chamada de função anônima.

Note que realizamos operações com a variável i dentro da função retornada.

 

Retornamos a função closure para as variáveis c1 e c2, embora seja a mesma implementação os retornos são duas closures diferentes com escopos léxicos independentes, sendo assim teremos a variável local ‘i’ em c1 e outra variável local ‘i’ em c2. O que torna isso possível é o fato de a função retornada e a variável local ‘i’ estarem no mesmo escopo ao serem criadas quando a função contador é chamada. E, é claro, graças a implementação do mecanismo de interpretação dessa característica em C.

Note que a cada chamada de c1 o valor de ‘i’ é preservado internamente em seu escopo léxico fechado e incrementado o valor 1.

–> 1, 2, 3, 4 ….

 

Veja que, realmente, cada closure tem seu escopo léxico fechado independente, tanto que quando a função c2 é chamada pela primeira vez, ela começa do 1 e não da continuidade de c1;

Esse foi só um exemplo simples, mas com essa característica da linguagem você conseguirá fazer coisas poderosas como: percorrer e/ou analisar dados, contadores, temporizadores, callbacks, iteradores a serem usados no comando ‘para’ etc…

Bom, por enquanto é isso, até mais…

 

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *