# Cidadão de primeira classe

No design das linguagens de programação, a tradução literal de First-class Citizen: Cidadão de Primeira Classe (também tipo, objeto, entidade ou valor de primeira classe) em uma determinada linguagem de programação é uma entidade que suporta todas as operações geralmente disponíveis para outras entidades. Estas operações incluem, normalmente, ser passado como um argumento, retornado por uma função, modificado, e atribuído a variáveis.

## História

O conceito de primeira e de segunda classe de objetos foi introduzida por Christopher Strachey na década de 1960. Ele não define realmente o termo estritamente, mas contrastado números reais e procedimentos em ALGOL:
   Objetos de primeira e segunda classe.
Durante a década de 1990, Raphael Finkel propôs definições para valores de segunda e terceira classe, mas essas definições não têm sido amplamente adotadas.

## Exemplos

Os mais simples tipos de dados de variáveis, tais como inteiros e números de ponto flutuante, são quase sempre de primeira classe.
Em muitas das antigas línguas, matrizes e cadeias de caracteres não são de primeira classe: eles não podem ser designados como objetos ou passados como parâmetros para uma sub-rotina. Por exemplo, nem Fortran IV , nem C suporta atribuição de matrizes, e quando são passados como parâmetros, apenas a posição do primeiro elemento é, na verdade passada — seu tamanho é perdido. C aparece para apoiar a atribuição de matriz de ponteiros, mas na verdade estes são apenas ponteiros para o primeiro elemento da matriz, e novamente não têm o tamanho de matriz.
Na maioria das linguagens, tipos de dados não são objetos de primeira classe, embora em algumas linguagens orientadas a objeto classes são objetos de primeira classe e são usado para metaclasses.
Algumas linguagens suportam continuações e o comando GOTO-labels como objetos, muito menos como primeira-classe de objetos.
| Conceito | Descrição | Linguagens |
| Função de Primeira Classe | clausuras e funções anônimas | Scheme, ML, Haskell, F#, Scala, Swift, Perl 6 |
| Controle de Primeira Classe | continuações | Scheme, ML, F# |
| Tipo de Primeira Classe | Coq, Idris |
| Tipo de Dados de Primeira Classe | Generic Haskell |
| Polimorfismo de Primeira Classe | impredicative polimorfismo |
| Mensagem de Primeira Classe | mensagens dinâmicas (chamadas de método) | Smalltalk, Objective-C |
| Classe de primeira classe | metaclasse | Smalltalk, Objective-C, Ruby, Python |
| proof object | Coq, Agda |

## Funções

Várias linguagens de programação suportam passar e retornar valores de função, que podem ser aplicados nos argumentos.Se isso é suficiente para invocar(chamar) valores de funções como primeira classe é contestado.
Alguns autores dizem ser possível criar novas funções no tempo de execução do que denomina-las 'Primeira Classe'. Como resultado, funções em C não são Objetos de Primeira Classe; ao invés, eles são às vezes chamados de Objetos de Segunda Classe, porque eles ainda podem ser manipulados  na maioria das formas acima (via ponteiros de função) .
Em Smalltalk, funções (métodos) são Objetos de Primeira Classe, como classes de Smalltalk. Já que operadores Smalltalk (+, -, etc.) são métodos, eles também são Objetos de Primeira Classe.

## Reflexão

Algumas Linguagens, como Java, tem sub-sistemas de reflexão explicita, que permitem acesso para estruturas de implementação interna, apesar deles não serem acessíveis ou manipuláveis de mesma maneira como objetos comuns.

## Veja também

* First-class function

## References

* ↑ Scott, Michael (2006). Programming Language Pragmatics. San Francisco, CA: Morgan Kaufmann Publishers. p. 140
* ↑ Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
* ↑ Harold Abelson and Gerald Jay Sussman, Structure and Interpretation of Computer Programs, 2nd edition, section 1.3.4 footnote 64 Arquivado em 9 de março de 2015, no Wayback Machine.
* ↑ Christopher Strachey, "Fundamental Concepts in Programming Languages" in Higher-Order and Symbolic Computation 13:11 (2000); though published in 2000, these are notes from lectures Strachey delivered in August, 1967
* ↑ Finkel, R. Advanced Programming language Design, p 73
* ↑ Norman Ramsey. «About first-,second- and third-class value». stackoverflow.com. Consultado em 14 de setembro de 2013
* 1 2 Paritosh Shroff, Scott F. Smith.
* ↑ Bove, Ana; Dybjer, Peter (2009). «Dependent Types at Work» (PDF). Language Engineering and Rigorous Software Development. 5520: 57–99. doi:10.1007/978-3-642-03153-3_2. Consultado em 8 de junho de 2015