Comecei a dar uma olhada séria no Lisp neste fim de semana (com o que quero dizer que só aprendi o Lisp e não voltei a projetos em C #) e devo dizer que eu amo isso. Eu brinquei com outras linguagens funcionais (F #, Haskell, Erlang), mas não senti a atração que Lisp me deu.
Agora, enquanto continuo aprendendo o Lisp, comecei a me perguntar por que linguagens não funcionais não suportam funções de primeira classe. Eu sei que linguagens como C # podem fazer coisas semelhantes com delegados e, até certo ponto, você pode usar ponteiros para funções em C / C ++, mas existe uma razão pela qual isso nunca se tornaria um recurso nessas linguagens? Existe uma desvantagem em criar funções de primeira classe? Para mim, é extremamente útil, por isso estou perdido porque mais idiomas (fora do paradigma funcional) não o implementam.
[Editar] Agradeço as respostas até agora. Como me foi mostrado que muitos idiomas agora suportam funções de primeira classe, refiz a pergunta: por que demoraria tanto tempo para os idiomas implementá-los? [/Editar]
Respostas:
C #, VB.NET, Python, JavaScript, agora até C ++ 0x fornecem funções de primeira classe.
Atualizar:
Uma implementação de fechamentos requer o levantamento de lambda - uma técnica originalmente bastante estranha para os programadores imperativos. As funções adequadas de primeira classe (que incluem fechamentos) requerem pelo menos algum suporte do tempo de execução e da VM. Também levou algum tempo para adotar as antigas técnicas funcionais no mundo imperativo.
E a parte mais importante - as funções de primeira classe dificilmente podem ser usadas se não houver coleta de lixo presente. Foi introduzido em uma programação em massa apenas recentemente, com Java e, conseqüentemente, .NET. E a abordagem Java original era simplificar demais a linguagem para mantê-la compreensível pelos codificadores comuns. O .NET foi o primeiro a seguir, e apenas recentemente se separou dessa direção (IMHO, bastante justificada e apropriada).
Todos esses conceitos levam tempo para serem digeridos pela indústria.
fonte
Funções de primeira classe são muito menos interessantes sem fechamentos.
Os fechamentos não são realmente possíveis sem algum tipo de gerenciamento dinâmico de escopo (coleta de lixo). Uma das coisas que faz com que o C / C ++ seja de alto desempenho é o fato de ser muito mais fácil compilar uma linguagem na qual você gerencia manualmente a memória, de modo que tira o C / C ++ da equação.
E então sim, há a questão do impacto no POO. Você não tem mais uma separação de métodos e propriedades. Os próprios métodos são propriedades que aceitam funções como valores. Nesse contexto, o que realmente significa sobrecarregar métodos, já que você pode trocar as coisas bobas a qualquer momento. Você pode realmente adicionar isso ao Java, por exemplo, sem introduzir uma grande mudança de paradigma em toda a linguagem? Onde está o contrato ou o senso de segurança (falso da OMI) ao saber que a construção garante que sempre funcionará da mesma maneira todas as vezes? Pode fazer sentido tratar funções vinculadas a objetos como métodos como um organismo diferente em linguagens que permitiam que as funções existissem independentemente em primeiro lugar, mas em Java isso não é realmente uma opção.
Em JavaScript, OOP e funcional estão muito interligados e, pessoalmente, acho difícil ver funções de primeira classe como qualquer coisa, exceto em linguagens onde elas não estavam. Mas isso requer várias outras mudanças de mudança de paradigma, incluindo altos níveis de mutabilidade nos objetos e em seus próprios métodos, além de poder chamar funções como se fossem membros de qualquer objeto em movimento.
Os idiomas não são apenas conjuntos de ferramentas cheios de truques para fazer as coisas na maior parte do tempo. Eles são paradigmas. Conjuntos de idéias, estratégias e opiniões que se combinam de uma maneira que está conectada (ou parece conectada). Em muitos casos, funções como substantivo e verbo realmente simplesmente não se encaixam no paradigma ou, na melhor das hipóteses, são um ajuste imperfeito.
Dito isto, sinto como se estivesse perdendo um braço quando forçado a codificar sem eles.
fonte
Não é realmente impossível. Mas é mais um recurso, e o orçamento de complexidade é limitado. Pode ser considerado desnecessário (ou nem ocorrer) ao designer da linguagem - "por que diabos precisaríamos transmitir funções? Essa linguagem é para programar um sistema operacional!". Também pode ser necessário um esforço significativo para mesclar com o restante do idioma. Por exemplo, um tipo de função pode exigir acréscimos sérios ao sistema de tipos (por exemplo, em Java), ainda mais se você estiver sobrecarregando (obrigado @Renesis por apontar isso). Você também precisa fornecer algum código de biblioteca para fazer uso do viável - ninguém quer se definir
map
.Também poderia dificultar a realização de outros objetivos da linguagem:
f
nunca é reatribuído antes de incorporá-lo.Do mesmo modo, pode-se perguntar por que qualquer linguagem de programação L1 não possui o recurso F da linguagem L2 muito diferente.
fonte
Penso que o primeiro problema é um mal-entendido de que Orientado a Objetos e Funcionais não podem ser misturados. Uma lista rápida de idiomas descritos, pelo menos pela Wikipedia, como ambos: JavaScript , ActionScript , Python , C # , F # .
O segundo problema parece ser uma definição de funções de primeira classe - por que você não considera C # tê-las, por exemplo?
Como não sou especialista em linguagem funcional, por favor, corrija-me nos comentários, se estiver errado, mas meu entendimento é que a inclusão de funções de primeira classe define mais ou menos a si mesma, define se uma linguagem suporta um paradigma funcional .
Qual é a verdadeira questão?
Portanto, entendendo que as linguagens orientadas a objetos também podem ser funcionais, e essas linguagens contêm funções de primeira classe, parece que a pergunta que você está procurando é por que algumas linguagens orientadas a objetos não contêm funções de primeira classe?
Sobrecarga de função
Uma das principais razões para isso é a dificuldade de definir funções de primeira classe quando a linguagem também optou por oferecer suporte à sobrecarga de funções (exemplo em Java):
A qual
dispatchEvent
função uma variável se referiria?Programação baseada em classe
A programação baseada em classe não impede que um idioma suporte objetos de primeira classe, mas pode torná-lo mais confuso ou adicionar perguntas a serem respondidas.
O ActionScript, por exemplo, como uma linguagem ECMAScript começou em um paradigma muito mais funcional como o JavaScript. As funções não eram inerentemente vinculadas a objetos, elas poderiam ser chamadas essencialmente com qualquer objeto, pois seu escopo no momento da execução.
Ao adicionar classes (não dinâmicas), você tem funções inerentemente ligadas a uma instância, não apenas a própria classe. Isso lança algumas rugas na especificação de
Function.apply
que eu sinceramente não procurei descobrir como eles lidaram com isso.fonte
Eu me perguntei a mesma coisa. Quando estou em um idioma com lambdas, uso-os MUITO. Até o PHP melhora quando você percebe que pode fazer um fechamento com o php 5.3 (não é tão bom quanto o lisp, mas ainda melhor)
fonte