Funciones de primera clase
# Funciones de primera clase

En ciencias de la computación, se dice que un lenguaje de programación tiene funciones de primera clase si trata las funciones como ciudadanos de primera clase. Esto significa que admite:

* Poder pasar funciones como argumentos a otras funciones.
* Que el valor de retorno de una función sea otra función.
* Asignar funciones a variables o almacenarlas en estructuras de datos.

Algunos teóricos de lenguajes de programación sugieren el requerimiento o soporte para funciones anónimas (funciones literales). En lenguajes con funciones de primera clase, los nombres de las funciones no tienen ningún estatus especial; se tratan como variables ordinarias de tipo función . El término fue acuñado por Christopher Strachey en el contexto de «funciones como ciudadanos de primera clase» a mediados de la década de 1960.

Las funciones de primera clase son necesarias para el paradigma de programación funcional, en el que el uso de funciones de orden superior es una práctica estándar.

A la hora de implementar funciones de primera clase existen ciertas dificultades para pasar funciones como argumentos o devolverlas como resultados, especialmente en presencia de variables no locales introducidas en funciones anidadas y anónimas. Históricamente, estos se denominaron problemas de funarg, el nombre proviene de «function argument» (argumentos de la función). En los primeros lenguajes de programación imperativos, estos problemas se evitaron al no admitir funciones como valores de retorno (por ejemplo, ALGOL 60, Pascal) u omitir funciones anidadas y, por lo tanto, variables no locales (p. ej. C ). Lisp, el primer lenguaje funcional, adoptó el enfoque de alcance dinámico, donde las variables no locales se refieren a la definición más cercana de esa variable en el punto donde se ejecuta la función, en lugar de donde se definió. El soporte adecuado para funciones de primera clase con alcance léxico se introdujo en Scheme y requiere el manejo de referencias a funciones como clausuras en lugar de simples punteros de función, lo que a su vez hace necesaria la recolección de elementos no utilizados.

