J'ai commencé à jeter un œil sérieux à Lisp ce week-end (j'entends par là que je n'ai appris que Lisp et que je ne suis pas revenu à des projets en C #) et je dois dire que j'adore ça. J'ai essayé d'autres langages fonctionnels (F #, Haskell, Erlang) mais je n'ai pas ressenti le tirage que Lisp m'a donné.
Maintenant que je continue d'apprendre Lisp, j'ai commencé à me demander pourquoi les langages non fonctionnels ne prennent pas en charge les fonctions de première classe. Je sais que des langages tels que C # peuvent faire des choses similaires avec les délégués et dans une certaine mesure, vous pouvez utiliser des pointeurs vers des fonctions en C / C ++, mais y a-t-il une raison pour laquelle cela ne deviendrait jamais une fonctionnalité dans ces langages? Y a-t-il un inconvénient à rendre les fonctions de première classe? Pour moi, c'est extrêmement utile, donc je ne sais pas pourquoi plus de langues (en dehors du paradigme fonctionnel) ne l'implémentent pas.
[Modifier] J'apprécie les réponses jusqu'à présent. Puisqu'on m'a montré que de nombreuses langues prennent désormais en charge des fonctions de première classe, je reformulerai la question: pourquoi faudrait-il autant de temps aux langues pour les implémenter? [/Éditer]
Réponses:
C #, VB.NET, Python, JavaScript, maintenant même C ++ 0x fournit des fonctions de première classe.
Mettre à jour:
Une implémentation de fermetures nécessite un lambda-lifting - une technique à l'origine assez étrangère aux programmeurs impératifs. Les fonctions de première classe appropriées (qui incluent les fermetures) nécessitent au moins une certaine prise en charge par le runtime et la machine virtuelle. Il a également fallu un certain temps pour intégrer les anciennes techniques fonctionnelles dans le monde impératif.
Et, la partie la plus importante - les fonctions de première classe sont à peine utilisables s'il n'y a pas de récupération de place. Il n'a été introduit dans une programmation de masse que récemment, avec Java et, par conséquent, .NET. Et l'approche Java originale consistait à simplifier à l'excès le langage afin de le rendre compréhensible par les codeurs moyens. .NET a d'abord suivi et s'est récemment séparé de cette direction (à mon humble avis, tout à fait justifiée et appropriée).
Tous ces concepts prennent du temps à être digérés par l'industrie.
la source
Les fonctions de première classe sont beaucoup moins intéressantes sans fermetures.
Les fermetures ne sont pas vraiment possibles sans une sorte de gestion dynamique de la portée (garbage collection). L'une des choses qui rend C / C ++ si performant est le fait qu'il est beaucoup plus facile de compiler un langage dans lequel vous gérez la mémoire manuellement, de sorte que le C / C ++ est retiré de l'équation.
Et puis oui, il y a la question de l'impact de la POO. Vous n'avez plus de séparation des méthodes et des propriétés. Les méthodes sont elles-mêmes des propriétés qui acceptent les fonctions comme valeurs. Dans ce contexte, qu'est-ce que cela signifie vraiment de surcharger les méthodes puisque vous pouvez simplement échanger les choses idiotes à tout moment. Pouvez-vous vraiment ajouter cela à Java, par exemple, sans introduire un changement de paradigme majeur pour l'ensemble du langage? Où est le contrat ou ce sentiment de sécurité (faux OMI) que les gens connaissent en sachant que la construction garantit qu'elle fonctionnera toujours de la même manière à chaque fois? Il pourrait être judicieux de traiter les fonctions liées aux objets comme des méthodes comme un organisme différent dans les langages qui permettaient aux fonctions d'exister indépendamment en premier lieu, mais en Java, ce n'est pas vraiment une option.
En JavaScript, la POO et la fonctionnalité sont très imbriquées et je trouverais personnellement difficile de voir les fonctions de première classe comme tout sauf boulonnées dans des langues où elles ne l'étaient pas. Mais cela nécessite un certain nombre d'autres changements de changement de paradigme, notamment des niveaux élevés de mutabilité dans les objets et leurs méthodes eux-mêmes, ainsi que la possibilité d'appeler des fonctions comme s'ils étaient membres d'un objet à la volée.
Les langues ne sont pas seulement des ensembles d'outils remplis de do-hickeys pour faire avancer les choses pour la plupart. Ce sont des paradigmes. Des bundles d'idées, de stratégies et d'opinions qui vont de pair, d'une manière qui est connectée (ou semble connectée). Dans de nombreux cas, les fonctions de nom et de verbe ne correspondent pas du tout au paradigme ou, au mieux, sont un ajustement imparfait.
Cela dit, j'ai l'impression de manquer un bras lorsque je suis obligé de coder sans eux.
la source
Ce n'est pas vraiment impossible. Mais c'est encore une autre fonctionnalité, et le budget de complexité est limité. Il peut être considéré comme inutile par (ou ne vient même pas à l'esprit) par le concepteur de langage - "pourquoi diable aurions-nous besoin de passer des fonctions? Ce langage est destiné à la programmation d'un système d'exploitation!". La fusion avec le reste de la langue peut également demander des efforts importants. Par exemple, un type de fonction peut nécessiter de sérieux ajouts au système de type (par exemple en Java), encore plus si vous avez une surcharge (merci @Renesis de l'avoir signalé). Vous devez également fournir du code de bibliothèque pour utiliser le viable - personne ne veut se définir
map
.Cela pourrait également rendre d'autres objectifs de la langue plus difficiles à atteindre:
f
ne sont jamais réaffectées avant de les aligner.Dans le même ordre d'idées, on peut se demander pourquoi un langage de programmation L1 n'a pas la caractéristique F du langage très différent L2.
la source
Je pense que le premier problème est un malentendu selon lequel Orienté Objet et Fonctionnel ne peuvent pas être mélangés. Une liste rapide des langages décrits, au moins par Wikipedia, comme les deux: JavaScript , ActionScript , Python , C # , F # .
Le deuxième problème semble être une définition des fonctions de première classe - pourquoi ne considérez-vous pas que C # en a, par exemple?
Je ne suis pas un expert en langage fonctionnel, veuillez donc me corriger dans les commentaires si je me trompe, mais je crois comprendre que l'inclusion de fonctions de première classe elle-même définit plus ou moins si un langage prend en charge un paradigme fonctionnel .
Quelle est la vraie question?
Donc, comprendre que les langages orientés objet peuvent également être fonctionnels et que ces langages contiennent des fonctions de première classe, il semble que la question que vous cherchez est pourquoi certains langages orientés objet ne contiennent-ils pas de fonctions de première classe?
Surcharge de fonction
L'une des principales raisons à cela est la difficulté de définir des fonctions de première classe lorsque le langage a également choisi de prendre en charge la surcharge de fonctions (exemple en Java):
À quelle
dispatchEvent
fonction une variable ferait-elle référence?Programmation par classe
La programmation basée sur les classes n'empêche pas un langage de prendre en charge des objets de première classe, mais elle peut rendre les choses plus confuses ou ajouter des questions auxquelles il faut répondre.
ActionScript, par exemple, en tant que langage ECMAScript a commencé dans un paradigme beaucoup plus fonctionnel comme JavaScript. Les fonctions n'étaient pas intrinsèquement liées aux objets, elles pouvaient essentiellement être appelées avec n'importe quel objet car elles sont de portée au moment de l'exécution.
Lorsque vous ajoutez des classes (non dynamiques), vous avez des fonctions qui sont intrinsèquement liées à une instance, pas seulement la classe elle-même. Cela jette quelques rides dans la spécification de ce
Function.apply
que je n'ai honnêtement pas creusé pour savoir comment ils l'ont traité.la source
Je me suis demandé la même chose moi-même. Une fois que je suis dans une langue avec les lambdas, je les utilise beaucoup. Même PHP s'améliore quand vous réalisez que vous pouvez faire une fermeture avec php 5.3 (ce n'est pas aussi agréable que lisp, mais c'est encore mieux)
la source