Cidadão de primeira classe - First-class citizen

No projeto de linguagem de programação , um cidadão de primeira classe (também tipo , objeto , entidade ou valor ) em uma determinada linguagem de programação é uma entidade que suporta todas as operações geralmente disponíveis para outras entidades. Essas operações normalmente incluem ser passado como um argumento, retornado de uma função, modificado e atribuído a uma variável.

História

O conceito de objetos de primeira e segunda classes foi introduzido por Christopher Strachey na década de 1960. Na verdade, ele não definiu o termo estritamente, mas comparou números reais e procedimentos no ALGOL :

Objetos de primeira e segunda classe. No ALGOL, um número real pode aparecer em uma expressão ou ser atribuído a uma variável, e qualquer um deles pode aparecer como um parâmetro real em uma chamada de procedimento. Por outro lado, um procedimento só pode aparecer em outra chamada de procedimento como operador (o caso mais comum) ou como um dos parâmetros reais. Não existem outras expressões que envolvam procedimentos ou cujos resultados sejam procedimentos. Assim, em certo sentido, os procedimentos no ALGOL são cidadãos de segunda classe - eles sempre têm que aparecer pessoalmente e nunca podem ser representados por uma variável ou expressão (exceto no caso de um parâmetro formal) ...

Robin Popplestone deu a seguinte definição: Todos os itens têm certos direitos fundamentais.

  1. Todos os itens podem ser os parâmetros reais das funções
  2. Todos os itens podem ser retornados como resultados de funções
  3. Todos os itens podem ser objeto de declarações de atribuição
  4. Todos os itens podem ser testados quanto à igualdade.

Durante a década de 1990, Raphael Finkel propôs definições de valores de segunda e terceira classes, mas essas definições não foram amplamente adotadas.

Exemplos

Os tipos de dados escalares mais simples , como números inteiros e de ponto flutuante, são quase sempre de primeira classe.

Em muitas linguagens mais antigas, arrays e strings não são de primeira classe: eles não podem ser atribuídos como objetos ou passados ​​como parâmetros para uma sub-rotina. Por exemplo, nem o Fortran IV nem o C suportam atribuição de array, e quando eles são passados ​​como parâmetros, apenas a posição de seu primeiro elemento é realmente passada - seu tamanho é perdido. C parece oferecer suporte à atribuição de ponteiros de array , mas na verdade esses são simplesmente ponteiros para o primeiro elemento do array e, novamente, não carregam o tamanho do array.

Na maioria das linguagens, os tipos de dados não são objetos de primeira classe, embora em algumas linguagens orientadas a objetos, as classes sejam objetos de primeira classe e instâncias de metaclasses .

Poucas linguagens suportam continuações e rótulos GOTO como objetos, muito menos como objetos de primeira classe.

Conceito Descrição línguas
função de primeira classe fechamentos e funções anônimas Dart , Scheme , ML , Haskell , F # , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust
controle de primeira classe continuações Esquema , ML , F #
tipo de primeira classe tipos dependentes Coq , Idris , Agda
tipo de dados de primeira classe Haskell genérico , C ++ 11
polimorfismo de primeira classe polimorfismo impredicativo
mensagem de primeira classe mensagens dinâmicas (chamadas de método) Smalltalk , Objective-C
classe de primeira classe metaclasse Smalltalk , Objective-C , Ruby , Python , Delphi
provas de primeira classe objeto de prova Coq , Agda

Funções

Muitas linguagens de programação suportam a passagem e o retorno de valores de função, que podem ser aplicados a argumentos. Se isso é suficiente para chamar os valores da função de primeira classe, é questionado.

Alguns autores exigem que seja possível criar novas funções em tempo de execução para chamá-las de 'primeira classe'. Como resultado, as funções em C não são objetos de primeira classe; em vez disso, às vezes são chamados de objetos de segunda classe , porque ainda podem ser manipulados na maioria das formas acima (por meio de ponteiros de função ).

Em Smalltalk , funções (métodos) são objetos de primeira classe, assim como classes Smalltalk. Como os operadores Smalltalk (+, -, etc.) são métodos, eles também são objetos de primeira classe.

Reflexão

Algumas linguagens, como Java e PHP , possuem um subsistema de reflexão explícito que permite o acesso a estruturas de implementação internas, embora não sejam acessíveis ou manipuláveis ​​da mesma forma que objetos comuns.

Veja também

Referências