«Función de primera clase» es un término que se puede aplicar en programación de computadoras y ciencias de la computación a un lenguaje de programación de computadoras si su tratamiento de funciones se adhiere a un conjunto de pautas, aunque no se acuerda formalmente el alcance y la profundidad de estas pautas. . Para tener un lenguaje de programación de computadoras de funciones de primera clase, la característica principal que debe ser compatible es la capacidad de pasar funciones como argumentos a otras funciones. Una función también debe poder asignarse a una variable para que pueda almacenarse. Otras propiedades utilizadas para determinar qué constituye una función de primera clase incluyen la capacidad de generar dinámicamente una función en tiempo de ejecución y la capacidad del lenguaje de tener una función como valor de retorno de otra función. Los lenguajes que admiten la arquitectura de funciones de primera clase permiten un alto nivel de abstracción y también, en algunos casos, proporcionan un mecanismo para la generación de código dinámico en tiempo de ejecución.
Cuando el término «función» se usa en un sentido vagamente definido, el concepto de pasar una función dentro de un programa a través de variables no es necesariamente exclusivo de los lenguajes que implementan de forma nativa el soporte de funciones de primera clase. La capacidad de pasar bloques de código a funciones, o de devolver código no dinámico desde una función, se puede realizar fácilmente en muchos lenguajes de programación a través de diferentes mecanismos. Una de las partes estrictas de la definición de un lenguaje de funciones de primera clase, sin embargo, es que el manejo de funciones como variables debe hacerse de forma nativa, sin el uso de metadatos como definiciones condicionales y sin llamar a un compilador para recompilar una parte de código. El término «función» también se usa para referirse a bloques de código independientes que se llaman por sí mismos, lo que significa que no incluyen los bloques de código conocidos como métodos en los lenguajes de programación orientados a objetos o los bloques a veces llamados procedimientos en otros lenguajes.
Cuando un lenguaje está diseñado para permitir código de función de primera clase, algunos patrones de diseño se pueden implementar de forma más directa que en otros lenguajes. Una función puede recibir una función como una variable y luego construir una nueva función y devolver la nueva función al código de llamada, por lo que esto crea un mecanismo para la creación de código de programa en tiempo de ejecución. Esto también puede hacer posible el uso de funciones ingresadas por el usuario en tiempo real dentro del lenguaje sin el uso de procesos como la reflexión o la evaluación.
Algunos de los usos más básicos de la arquitectura de funciones de primera clase incluyen la creación de funciones genéricas que se pueden reutilizar fácilmente y la implementación de algoritmos matemáticos recursivos que pueden auto-modificar sus ecuaciones a medida que avanzan. Un uso similar y más avanzado de los mecanismos de primera clase es la implementación del polimorfismo en lenguajes en los que no está específicamente implementado. Esto puede permitir que las funciones se llamen con la misma firma de función pero ejecuten código según el contexto en el que se llamó, a veces pasando una función clave a la función polimórfica.