He visto muchas veces declaraciones como- «Por favor, haga de esta función un ciudadano de primera clase en tal o cual idioma / plataforma». Por ejemplo, se dice sobre enumeraciones en C # /. Net. Entonces, ¿cuándo una función se considera un «ciudadano de primera clase» en un lenguaje / plataforma de programación?

Comentarios

Respuesta

Definición

Un objeto es de primera clase cuando:

  • se puede almacenar en variables y estructuras de datos
  • se puede pasar como parámetro a una subrutina
  • se puede devolver como resultado de una subrutina
  • se puede construir en tiempo de ejecución
  • tiene una identidad intrínseca (independiente de cualquier nombre dado)

El término «objeto» se usa de manera vaga aquí, no necesariamente refiriéndose a objetos en la programación orientada a objetos. Los tipos de datos escalares más simples, como números enteros y de coma flotante, son casi siempre de primera clase.

http://en.wikipedia.org/wiki/First_class_object

Comentarios

  • Entonces, ¿qué hace que enums sea un objeto de segunda clase? en .net / C #?
  • @Gulshan – podría argumentar la falta de identidad intrínseca – Las enumeraciones de C # son básicamente azúcar sintáctica (es decir, un » nombre de pila «) para un valor entero. Compare con Java, donde las enumeraciones son objetos por derecho propio.
  • @mikera, en .NET las enumeraciones son valores por derecho propio. Java simplemente no tiene ningún valor, solo objetos, que ‘ es la única diferencia.
  • @mikera: Aunque eso evita que Java ‘ s enums por tener algunas propiedades agradables, como ser capaz de representar campos de bits con ellas. Si bien su implementación es probablemente más de primera clase, la mayoría de sus API todavía tienen muchas constantes enteras (o cadenas) y muchos usos de ellas no se pueden reemplazar fácilmente con enumeraciones.
  • No ‘ No creo que las enumeraciones se puedan construir en tiempo de ejecución en .Net, ¿verdad? Pensé que siempre eran constantes.

Respuesta

La noción de » ciudadano de primera clase » o » elemento de primera clase » en un lenguaje de programación fue introducido por el científico informático británico Christopher Strachey en la década de 1960 en el contexto de la primera -funciones de clase. La formulación más famosa de este principio se encuentra probablemente en Estructura e interpretación de programas informáticos de Gerald Jay Sussman y Harry Abelson:

  • Pueden ser nombrados por variables.
  • Pueden pasarse como argumentos a procedimientos.
  • Pueden devolverse como resultados de procedimientos.
  • Pueden estar incluidos en estructuras de datos.

Básicamente, significa que puede hacer con esto elemento del lenguaje de programación todo lo que puede hacer con todos los demás elementos del lenguaje de programación.

Se trata de » igualdad de derechos «: puedes hacer todo lo anterior, con, digamos, números enteros, entonces, ¿por qué debería ser diferente cualquier otra cosa?

La definición anterior es un poco restrictiva en el sentido de que solo habla sobre el aspecto de primera clase en relación con ser objetos del programa. Una definición más general sería Sería que una cosa es de primera clase si puede hacer todo con ella que también puede hacer con otras cosas de tipo similar.

Por ejemplo, los operadores de Java y los métodos de Java son de tipo similar. Puede definir nuevos métodos, puede (de alguna manera) elegir libremente los nombres de sus propios métodos, puede anular métodos, puede sobrecargar métodos. James Gosling también puede hacer todo eso con operadores, pero tú y yo no podemos. Quiero decir, contrariamente a la creencia popular, Java admite la sobrecarga de operadores: por ejemplo , el operador + está sobrecargado para byte, short, int, long, float, double y String y IIRC en Java 7 también para BigInteger y BigDecimal (y probablemente un par que olvidé), es sólo que usted no tiene ninguna influencia sobre él.Eso claramente hace que los operadores sean de segunda clase según esta segunda definición. Sin embargo, tenga en cuenta que los métodos todavía no son objetos de primera clase según la primera definición. (¿Eso hace que los operadores sean de tercera clase?)

Comentarios

  • Excelente respuesta. Por ejemplo, los pipenv docs dicen » Windows es un ciudadano de primera clase, en nuestro mundo. » ¿Implicaría esto que puede hacer todo con pipenv en Windows que también puede hacer con él en Linux?
  • No, yo ‘ no creo que el uso del término » ciudadano de primera clase » tiene algo que ver con la teoría formal del lenguaje de programación definición del término. Creo que pipenv solo está usando el término con su significado estándar en inglés.
  • Como en » tratado justamente? » Gracias por su ayuda.

Respuesta

Por lo general, esta referencia rs a una construcción que sea aceptable como parámetro, se puede definir como un tipo de retorno de una función o se le puede asignar un valor. Normalmente, debe poder construirlos en tiempo de ejecución. Por ejemplo, una instancia de una clase sería un ciudadano de primera clase en c ++ o java, pero una función en C no lo sería.

Comentarios

  • ¿Qué hace que una clase sea un ciudadano de primera clase en c ++?
  • @bjarkef: Parece que eso ya fue respondido por su coincidencia con la descripción ofrecida en las oraciones anteriores.
  • @Jonathan: Sí, lo siento, leí mal las » en tiempo de ejecución «. Sí, puede construir una instancia de una clase en tiempo de ejecución (un objeto), pero no la clase en sí. Eso es lo que me confundió.
  • Pasar por parámetro todavía no es suficiente. En C / C ++ todavía consideraría las funciones como ciudadanos de segunda clase. Pueden pasarse como parámetros, devolverse como resultados colocados dentro de otros objetos. Pero no se pueden manipular sin la ayuda de otras construcciones (como std :: bind es necesario para vincular parámetros a una función).
  • @Martin Nunca dije que las funciones fueran ciudadanos de primera clase en C / C ++ .

Responder

Yo diría que una característica es un ciudadano de primera clase si se implementa únicamente por el idioma .
es decir, no requiere múltiples características de lenguaje o una biblioteca estándar para implementar esa característica.

Ejemplo:

En C / C ++ no considero que las funciones sean las primeras ciudadano de clase (otros pueden).
Esto se debe a que hay formas de manipular funciones que no son compatibles directamente con el lenguaje pero que requieren el uso de otras características del lenguaje. La vinculación de parámetros a una función no se admite directamente y debe crear un functor para implementar esta función.

Comentarios

  • wouldn ‘ t que hacen que las funciones enlazadas (o » cierres «) no sean de primera clase, mientras que las funciones mismas sí lo son? ¿Cómo influye en su análisis la compatibilidad de 0x ‘ s para los cierres?
  • @Fred Nurk: Todo depende del idioma. En algunos idiomas, los cierres son sistemas de primera clase. En otros no. No estoy lo suficientemente familiarizado con C ++ 0x como para hacer un comentario explícito.
  • Dejemos que ‘ s digamos que el lenguaje es C o C ++ (pero no 0x ), como en tu respuesta. ¿No sería ‘ su definición de » primera clase » funciones vinculadas (o » los cierres «) no son de primera clase, mientras que las funciones en sí lo son?
  • @Fred Nurk: Si limita lo único que puedes hacer con una función es convertirlas en un cierre, entonces seguro. Pero para mí, eso ‘ es como decir si su plataforma admite la suma de enteros solo importando una biblioteca. Entonces, los números enteros son ciudadanos de primera clase, pero la suma de números enteros no se considera. En mi opinión, el cierre es una operación que se puede realizar en una función que devuelve efectivamente una nueva función (pero depende de cómo la defina). Pero el cierre y la vinculación son solo dos operaciones, cuántas otras estamos excluyendo de la discusión (no estoy seguro de que fuera una pregunta).
  • @Martin: No debo explicarme claramente. Dado » una característica es un ciudadano de primera clase si se implementa únicamente en el lenguaje «, entonces se implementan las funciones tanto en C como en C ++ únicamente por el idioma y, por lo tanto, sería de primera clase. Las funciones enlazadas (que también se pueden llamar » cierres «) son lo que ‘ re hablando con parámetros de enlace, etc., pero que ‘ es una característica diferente.

Respuesta

Para agregar un ejemplo a las respuestas ya proporcionadas:

En WCF / C # actualmente tiene que marcar un objeto de clase con un atributo de contrato de servicio para que funcione como un servicio. No existe tal cosa como:

public **service** MyService (in relation public **class** MyClass). 

Una clase es un ciudadano de primera clase en c #, donde un servicio no lo es.

Hope esto ayuda

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *