Função de primeira classe
# Função de primeira classe

Em ciência da computação, diz-se que uma linguagem de programação tem funções de primeira classe se ela trata as funções como cidadãos de primeira classe. Isso significa que a linguagem suporta a passagem de funções como argumentos para outras funções, retornando-as como os valores de outras funções e atribuindo-as a variáveis ​​ou armazenando-as em estruturas de dados. Alguns teóricos da linguagem de programação também requerem suporte para funções anônimas (literais de função). Em linguagens com funções de primeira classe, os nomes das funções não têm nenhum estado especial. Eles são tratados como variáveis ​​comuns com um tipo de função. O termo foi cunhado por Christopher Strachey no contexto de "funções como cidadãos de primeira classe" em meados da década de 1960.
As funções de primeira classe são uma necessidade para o estilo de programação funcional, no qual o uso de funções de ordem superior é uma prática padrão. Um exemplo simples de função de ordem superior é a função map, que recebe, como seus argumentos, uma função e uma lista, e retorna a lista formada pela aplicação da função a cada membro da lista. Para que uma linguagem suporte map, ela deve suportar a passagem de uma função como um argumento.
Existem certas dificuldades de implementação em passar funções como argumentos ou retorná-las como resultados, especialmente na presença de variáveis ​​não locais introduzidas em funções aninhadas e anônimas. Historicamente, essas dificuldades foram chamados de problemas funarg, o nome vindo de "function argument" (argumento de função, em português). Nas primeiras linguagens imperativas, esses problemas foram evitados por não suportar funções como tipos de resultado (por exemplo, ALGOL 60, Pascal) ou omitir funções aninhadas e, portanto, variáveis ​​não locais (por exemplo, C). A antiga linguagem funcional Lisp adotou a abordagem de escopo dinâmico, onde variáveis ​​não locais se referem à definição mais próxima daquela variável no ponto onde a função é executada, ao invés de onde ela foi definida. O suporte adequado para funções de primeira classe com escopo léxico foi introduzido em Scheme e requer o tratamento de referências a funções como clausuras em vez de ponteiros de função vazios, que, por sua vez, torna a coleta de lixo uma necessidade.