Los objetos de primera clase ( objeto de primera clase en inglés , entidad de primera clase, ciudadano de primera clase ) en el contexto de un lenguaje de programación particular son elementos que se pueden pasar como un parámetro, devueltos desde una función, asignados a una variable [ 1] .
El concepto de objetos de primera y segunda clase fue propuesto en 1967 por Christopher Strachey en el artículo "Understanding Programming Languages", donde comparaba los procedimientos del lenguaje Algol , en contraposición a los números reales , con "ciudadanos de segunda clase" socialmente discriminados. " ( ciudadanos ingleses de segunda clase ) [2] .
Un objeto se denomina "objeto de primera clase" si es [3] [4] :
El término "objeto" se usa aquí en un sentido general y no se limita a los objetos del lenguaje de programación . Así, los valores de los tipos de datos más simples , como enteros y flotantes , son "objetos de primera clase" en muchos lenguajes.
En C y C++ , no puede crear funciones en tiempo de ejecución, por lo que las funciones no son objetos de primera clase en esos lenguajes. Al mismo tiempo, los punteros de función se pueden pasar como un argumento y devolver desde otra función, razón por la cual las funciones en C++ a veces se denominan objetos de segunda clase . Sin embargo, en C++ existe el concepto de objeto de función , que es un objeto de primera clase e implementa una semántica equivalente a las funciones [3] .
En Smalltalk [5] , Scala y JavaScript [6] las funciones (métodos) y las clases son objetos de primera clase. Dado que los operadores ( +, -) son esencialmente métodos en Smalltalk, también son objetos de primera clase.
Ejemplo de código en lenguaje Nim .
# asignar el procedimiento a una variable var value = proc () = echo "value" valor () # llamada a procedimiento var valor2 = valor valor2 () # llamada a procedimiento # el procedimiento será pasado a otro proc two (): string = return "two" # el procedimiento recibirá otro procedimiento proc wrap ( x : proc ) = echo "uno" echo x () echo "tres" # llamar a un procedimiento que recibe otro procedimiento como envoltura de entrada ( dos ) # un procedimiento que devuelve un procedimiento proc closure ( x : int ): proc = proc res ( y : int ): int = return y * y + x return res var resultado = cierre ( 2 ) # llamar a un procedimiento que devolverá otro procedimiento echo resultado ( 3 ) # llamar a un procedimiento interno