Cidadão de primeira classe

Origem: Wikipédia, a enciclopédia livre.

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 à variáveis.[1]

História[editar | editar código-fonte]

O conceito de primeira e de segunda classe de objetos foi introduzida por Christopher Strachey na década de 1960.[2][3] Ele não define realmente o termo estritamente, mas contrastado números reais e procedimentos em ALGOL:

Objetos de primeira e segunda classe.

Em Algol, um número real pode aparecer em uma expressão ou ser atribuído a uma variável, e qualquer um deles poderá aparecer como um parâmetro em uma chamada de procedimento. Um procedimento, por outro lado, só podem aparecer em outra chamada de procedimento como um operador (o caso mais comum) ou como um dos parâmetros reais. Não há outras expressões que envolvam procedimentos ou cujos resultados são procedimentos. Assim, também procedimentos em Algol são cidadãos de segunda classe—eles sempre tem que aparecer em pessoa e nunca podem ser representados por uma variável ou expressão (exceto no caso de um parâmetro formal)... [4]

Durante a década de 1990, Raphael Finkel[5] propôs definições para valores de segunda e terceira classe, mas essas definições não têm sido amplamente adotadas.[6]

Exemplos[editar | editar código-fonte]

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,[7] Objective-C[7]
Classe de primeira classe metaclasse Smalltalk, Objective-C, Ruby, Python
proof object[8] Coq, Agda

Funções[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

  • First-class function

References[editar | editar código-fonte]

  1. Scott, Michael (2006). Programming Language Pragmatics. San Francisco, CA: Morgan Kaufmann Publishers. p. 140 
  2. Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
  3. 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.
  4. 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
  5. Finkel, R. Advanced Programming language Design, p 73
  6. Norman Ramsey. «About first-,second- and third-class value». stackoverflow.com. Consultado em 14 de setembro de 2013 
  7. a b Paritosh Shroff, Scott F. Smith.
  8. 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