Em ciência da computação e na programação uma clausura (do inglês closure) é uma função que referencia variáveis livres no contexto léxico. Uma clausura ocorre normalmente quando uma função é declarada dentro do corpo de outra, e a função interior referencia variáveis locais da função exterior. Em tempo de execução, quando a função exterior é executada, então uma clausura é formada, que consiste do código da função interior e referências para quaisquer variáveis no âmbito da função exterior que a clausura necessita.
Utilização As clausuras são utilizadas para:
Bibliotecas de software podem permitir que os usuários customizem o comportamento passando clausuras como argumentos às funções importantes. Por exemplo, uma função que classifique valores pode aceitar um argumento de clausura que compare os valores a ser classificados de acordo com um critério definido pelo próprio usuário.
As funções múltiplas podem ser produzidas num mesmo ambiente, permitindo-as de se comunicar confidencialmente.
Sistemas de objetos podem ser construídos com clausuras. Por exemplo, Scheme padrão não suporta programação orientada a objetos, mas há sistemas de objetos construídos para essa linguagem de programação com recurso a clausuras.
Exemplos
Ruby: def new_counter i = 0 lambda { i += 1 } end
c1 = new_counter puts c1.call puts c1.call puts c1.call puts c1.call puts c1.call
Lisp: (defun foo () (let ((counter 0)) ;; a função anônima a seguir é definida no escopo de counter, ;; por isso foo retornará uma clausura (lambda () (setf counter (+ 1 counter)) counter)))
(setf counter-1 (foo)) (setf counter-2 (foo))
(funcall counter-1) ==> 1 (funcall counter-1) ==> 2 (funcall counter-2) ==> 1
Javascript: function novoContador () { var i = 0; return function () { // função anônima i += 1; return i;
c1 = novoContador(); alert(c1()); // 1 alert(c1()); // 2 alert(c1()); // 3 alert(c1()); // 4 alert(c1()); // 5
PHP: function newCounter() { $i=0; return function() use (&$i) { return ++$i;
$countMe = newCounter(); print($countMe()); print($countMe()); print($countMe()); print($countMe());
Python: >>> def foo(start=0): ... counter = [start] # counter is 1-element array ... def bar(): ... counter = counter + 1 ... return counter ... return bar ... >>> count = foo(10) >>> count() 11 >>> count() 12
Scheme: (define (foo) (let ((counter 0)) (lambda () (set! counter (+ 1 counter)) counter)))
(define counter-1 (foo)) (define counter-2 (foo))
(counter-1) ==> 1 (counter-1) ==> 2 (counter-1) ==> 3 (counter-2) ==> 1
Na internet Foundations of Actor Semantics Will Clinger, MIT Mathematics Doctoral Dissertation. June 1981. Martin Fowler sobre Closure
Categoria:Programação Categoria:Teoria da computação