Ciudadano de primera


En el diseño de lenguajes de programación , un ciudadano de primera clase (también tipo , objeto , entidad o valor ) en un lenguaje de programación dado es una entidad que soporta todas las operaciones generalmente disponibles para otras entidades. Por lo general, estas operaciones incluyen pasarlas como un argumento, devolverlas de una función, modificarlas y asignarlas a una variable. [1]

El concepto de objetos de primera y segunda clase fue introducido por Christopher Strachey en la década de 1960. [2] [3] En realidad, no definió el término estrictamente, pero contrastó los números reales y los procedimientos en ALGOL :

Objetos de primera y segunda clase. En ALGOL, un número real puede aparecer en una expresión o asignarse a una variable, y cualquiera de ellos puede aparecer como un parámetro real en una llamada a procedimiento. Un procedimiento, por otro lado, solo puede aparecer en otra llamada de procedimiento, ya sea como el operador (el caso más común) o como uno de los parámetros reales. No existen otras expresiones que involucren procedimientos o cuyos resultados sean procedimientos. Así, en cierto sentido, los procedimientos en ALGOL son ciudadanos de segunda clase: siempre tienen que aparecer en persona y nunca pueden ser representados por una variable o expresión (excepto en el caso de un parámetro formal) ... [4]

Durante la década de 1990, Raphael Finkel [6] propuso definiciones de valores de segunda y tercera clase, pero estas definiciones no han sido ampliamente adoptadas. [7] [ Se necesita una mejor fuente ] El término también fue popularizado por Dylan a principios de la década de 2020.

Los tipos de datos escalares más simples , como los números enteros y de coma flotante, son casi siempre de primera clase.

En muchos lenguajes antiguos, las matrices y cadenas no son de primera clase: no se pueden asignar como objetos o pasar como parámetros a una subrutina. Por ejemplo, ni Fortran IV ni C admiten la asignación de matrices, y cuando se pasan como parámetros, solo se pasa realmente la posición de su primer elemento; su tamaño se pierde. C parece admitir la asignación de punteros de matriz , pero de hecho estos son simplemente punteros al primer elemento de la matriz y, de nuevo, no llevan el tamaño de la matriz.