Clausura (informática)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

En Informática, una clausura es una función que es evaluada en un entorno conteniendo una o más variables dependientes de otro entorno. Cuando es llamada, la función puede acceder a estas variables. El uso explícito de clausuras se asocia con programación funcional y con lenguajes como el ML y el Lisp. Construcciones como los objetos en otros lenguajes pueden ser también modelados con clausuras.

En algunos lenguajes, una clausura puede aparecer cuando una función está definida dentro de otra función, y la función más interna refiere a las variables locales de la función externa. En tiempo de ejecución, cuando la función externa se ejecuta, se forma una clausura, consistiendo en el código de la función interna y referencias a todas las variables de la función externa que son requeridas por la clausura.

Una clausura puede ser usada para asociar una función con un conjunto de variables "privadas", que persisten en las invocaciones de la función. El ámbito de la variable abarca sólo al de la función definida en la clausura, por lo que no puede ser accedida por otro código del programa. No obstante, la variable mantiene su valor de forma indefinida, por lo que un valor establecido en una invocación permanece disponible para la siguiente. Como consecuencia, las clausuras pueden ser usadas para esconder estados e implementar programación orientada a objetos.

El concepto de clausura fue desarrollado en los años 60 e implementado de forma completa, por primera vez, como una característica más del lenguaje de programación Scheme. Desde entonces, muchos otros lenguajes han sido diseñados para soportar clausuras.

Un ejemplo, en lenguaje Perl

#!/usr/bin/perl -w
 
# Aquí tenemos una función que crea otra, que nos servirá para saber si el argumento que le pasamos
# es superior o no al del valor de referencia con el que fue creada
sub crea_funcion_mayor_que ($) {
    my $limite = shift;            # Valor con el que se creará la función
                                   # La variable $limite es local a la función crea_funcion_mayor_que()
 
    return                         # Devolvemos
        sub {                          # una función
            return                         # que nos devuelve
                $_[0] > $limite;           #  verdadero si su primer argumento supera nuestro $limite.
        };
                                   # A partir de este punto $limite debería desaparecer,
                                   # pero no lo hace, porque sigue siendo referenciada
                                   # por la nueva función que acabamos de crear
}
 
my $es_mayor_que_5 = crea_funcion_mayor_que 5; # Creamos una función que comparará con el valor 5
my $es_mayor_que_3 = crea_funcion_mayor_que 3; # Idem, con el valor 3
 
my $test = 8; # Valor a comparar
 
if ( $es_mayor_que_5->($test) ) { # Ver si $test $es_mayor_que_5
    print "$test es mayor que 5 \n";
}
else {
    print "$test no es mayor que 5 \n";
}
 
# Aquí se podría utilizar la función $es_mayor_que_3 de la misma manera. Las dos variables
# $limite de las dos funciones creadas son completamente independientes entre sí.