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.[1]
Algunos teóricos de lenguajes de programación sugieren el requerimiento o soporte para funciones anónimas (funciones literales).[2] 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 .[3] 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.[4]
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).[5] 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,[4] lo que a su vez hace necesaria la recolección de elementos no utilizados.
Notas
editar- ↑ Abelson, Harold; Sussman, Gerald Jay (1984). Structure and Interpretation of Computer Programs. MIT Press. Formulating Abstractions with Higher-Order Procedures. ISBN 0-262-01077-1. Archivado desde el original el 21 de septiembre de 2021. Consultado el 16 de agosto de 2023.
- ↑ Programming language pragmatics, by Michael Lee Scott, section 11.2 "Functional Programming".
- ↑ Roberto Ierusalimschy; Luiz Henrique de Figueiredo; Waldemar Celes (2005). «The Implementation of Lua 5.0». Journal of Universal Computer Science 11 (7): 1159-1176. doi:10.3217/jucs-011-07-1159.
- ↑ a b Burstall, Rod; Strachey, Christopher (2000). «Understanding Programming Languages». Higher-Order and Symbolic Computation 13 (52): 11-49. Archivado desde el original el 16 de febrero de 2010.
- ↑ Joel Moses. "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem". MIT AI Memo 199, 1970.
Referencias
editar- Leónidas Fegaras . "Functional Languages and Higher-Order Functions" . CSE5317/CSE4305: Design and Construction of Compilers. University of Texas at Arlington.