De nombreux langages de programmation modernes prennent en charge un certain concept de fermeture , c'est-à-dire d'un morceau de code (un bloc ou une fonction) qui
- Peut être traité comme une valeur, et donc stocké dans une variable, transmis à différentes parties du code, être défini dans une partie d'un programme et appelé dans une partie totalement différente du même programme.
- Peut capturer des variables à partir du contexte dans lequel il est défini et y accéder lors de son invocation ultérieure (éventuellement dans un contexte totalement différent).
Voici un exemple de fermeture écrit en Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Le littéral de fonction x => x >= lowerBound
contient la variable libre lowerBound
, qui est fermée (liée) par l'argument de la fonction filterList
qui porte le même nom. La fermeture est transmise à la méthode de bibliothèque filter
, qui peut l'invoquer à plusieurs reprises en tant que fonction normale.
J'ai lu beaucoup de questions et réponses sur ce site et, si je comprends bien, le terme fermeture est souvent automatiquement associé à la programmation fonctionnelle et au style de programmation fonctionnelle.
La définition de la programmation des fonctions sur wikipedia se lit comme suit:
En informatique, la programmation fonctionnelle est un paradigme de programmation qui traite le calcul comme l'évaluation de fonctions mathématiques et évite les données d'état et mutables. Il met l'accent sur l'application des fonctions, contrairement au style de programmation impératif, qui met l'accent sur les changements d'état.
et plus loin
[...] dans le code fonctionnel, la valeur de sortie d'une fonction dépend uniquement des arguments qui sont entrés dans la fonction [...]. L'élimination des effets secondaires peut faciliter la compréhension et la prévision du comportement d'un programme, ce qui est l'une des principales motivations pour le développement d'une programmation fonctionnelle.
D'un autre côté, de nombreuses constructions de fermeture fournies par les langages de programmation permettent à une fermeture de capturer des variables non locales et de les modifier lorsque la fermeture est invoquée, produisant ainsi un effet secondaire sur l'environnement dans lequel elles ont été définies.
Dans ce cas, les fermetures implémentent la première idée de programmation fonctionnelle (les fonctions sont des entités de première classe qui peuvent être déplacées comme les autres valeurs) mais négligent la deuxième idée (en évitant les effets secondaires).
Cette utilisation des fermetures avec effets secondaires est-elle considérée comme un style fonctionnel ou les fermetures sont-elles considérées comme une construction plus générale qui peut être utilisée à la fois pour un style de programmation fonctionnel et non fonctionnel? Existe-t-il de la littérature sur ce sujet?
NOTE IMPORTANTE
Je ne remets pas en question l'utilité des effets secondaires ou des fermetures avec effets secondaires. De plus, je ne suis pas intéressé par une discussion sur les avantages / inconvénients des fermetures avec ou sans effets secondaires.
Je suis seulement intéressé de savoir si l'utilisation de telles fermetures est toujours considérée comme un style fonctionnel par le promoteur de la programmation fonctionnelle ou si, au contraire, leur utilisation est déconseillée lors de l'utilisation d'un style fonctionnel.