Clausura (informática)

En lenguajes de programación, una clausura o cerradura[1][2]​ (del inglés closure) es una técnica para implementar ámbitos léxicos en un lenguaje de programación con funciones de primera clase. Una cerradura es un registro que contiene una función junto con el ámbito donde fue declarada. La clausura permite que la función acceda a los valores de las variables declaradas en el mismo ámbito, aun cuando la invocación ocurra fuera de este. El uso de clausuras se asocia con el paradigma de programación funcional.

Una clausura puede aparecer como una función de nivel superior, cuando una función está definida dentro de otra función, y la función interna se refiere a las variables locales de la función externa. En tiempo de ejecución, cuando se ejecuta la función externa, se forma una clausura, que consta del código de la función interna y las referencias a todas las variables de la función externa que son requeridas por la clausura.

Una clausura asocia a una función con un conjunto de variables "privadas", que persisten en las invocaciones a la función. El ámbito de la variable abarca únicamente al ámbito donde la función fue declarada, por lo que no puede ser accedida desde otra parte del programa. No obstante, la variable mantiene su valor de forma indefinida para las siguientes invocaciones. Como consecuencia, las clausuras pueden ser usadas para simular el encapsulamiento y la ocultación de la programación orientada a objetos.

El concepto de clausura fue definido por Peter J. Landin en 1964.[3]​ Fue implementado de forma completa, por primera vez, como una característica del lenguaje de programación Scheme.[4]​ Desde entonces, otros lenguajes de programación han sido diseñados para soportar clausuras.

Ejemplos

Usando el 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í.

Véase también

Referencias

  1. Ernesto Cuadros-Vargas. «5.7.7 PL/Programación Funcional.». Sociedad Peruana de Computación. Consultado el 5 de octubre de 2017. 
  2. Alberto Pacheco (28 de marzo de 2007). «Programación Funcional». Instituto Tecnológico de Chihuahua. Consultado el 5 de octubre de 2017. 
  3. Turner (2012). «Some History of Functional Programming Languages» (pdf). En Loidl, Hans Wolfgang, ed. Trends in Functional Programming: Proceedings of the 13th International Symposium on Trends in Functional Programming, St Andrews, Scotland.: 1-20. 
  4. Sussman, Gerald Jay; Steele, Guy L. (Diciembre de 1975). Scheme: An Interpreter for the Extended Lambda Calculus.