Modèle lettre contre fermeture de classe

Scheme, qui a un système de portée lexicale de type ALGOL avec des variables dynamiques et le garbage collection, manque un modèle de programmation de pile et ne souffre pas des limitations des langages basés sur la pile. Les fermetures sont exprimées naturellement dans Scheme. La forme lambda entoure le code, et les variables libres de son environnement persistent dans le programme tant qu`elles peuvent être accédées, et ainsi elles peuvent être utilisées aussi librement que n`importe quelle autre expression Scheme. [citation nécessaire] Les fermetures sont utilisées pour implémenter le style de continuation-passing, et de cette manière, masquer l`État. Des constructions telles que des objets et des structures de contrôle peuvent ainsi être implémentées avec des fermetures. Dans certaines langues, une fermeture peut se produire lorsqu`une fonction est définie dans une autre fonction et que la fonction interne fait référence aux variables locales de la fonction externe. Au moment de l`exécution, lorsque la fonction externe s`exécute, une fermeture est formée, composée du code de la fonction interne et des références (les upvalues) à toutes les variables de la fonction externe requises par la fermeture. L`annotation @ClosureParams accepte minimalement un argument, qui est nommé un indicateur de type. Un indicateur de type est une classe qui est responsable de l`achèvement des informations de type au moment de la compilation pour la fermeture. Dans cet exemple, l`indicateur de type utilisé est Groovy. Transform.

STC. FirstParam qui indique au vérificateur de type que la fermeture acceptera un paramètre dont le type est le type du premier paramètre de la méthode. Dans ce cas, le premier paramètre de la méthode est person, de sorte qu`il indique au vérificateur de type que le premier paramètre de la fermeture est en fait une personne. Les valeurs de cas de classe correspondent si la valeur du commutateur est une instance de la classe isAnnotatedBy: prend un nœud AST et une classe (ou ClassNode), et indique si le nœud est annoté avec cette classe. Par exemple: isAnnotatedBy (node, NotNull) en bref, l`absence de l`annotation @ClosureParams sur une méthode acceptant une fermeture n`échouera pas la compilation. Si présent (et il peut être présent dans les sources Java ainsi que les sources Groovy), puis le vérificateur de type a plus d`informations et peut effectuer une inférence de type supplémentaire. Cela rend cette fonctionnalité particulièrement intéressante pour les développeurs de Framework. D version 1, a un support de fermeture limité. Par exemple, le code ci-dessus ne fonctionnera pas correctement, parce que la variable a est sur la pile, et après le retour de test (), il n`est plus valide pour l`utiliser (plus probablement appeler foo via DG (), retournera un entier «aléatoire»). Cela peut être résolu en allouant explicitement la variable «a» sur le tas, ou en utilisant des structs ou une classe pour stocker toutes les variables fermées nécessaires et construire un délégué à partir d`une méthode implémentant le même code. Les fermetures peuvent être transmises à d`autres fonctions, tant qu`elles ne sont utilisées que lorsque les valeurs référencées sont toujours valides (par exemple, appeler une autre fonction avec une fermeture en tant que paramètre callback), et sont utiles pour écrire du code de traitement de données génériques, de sorte que cette la limitation, dans la pratique, n`est souvent pas une question.

L`utilisation de fermetures est associée à des langages où les fonctions sont des objets de première classe, dans lesquelles les fonctions peuvent être retournées en tant que résultats de fonctions d`ordre supérieur, ou transmises en tant qu`arguments à d`autres appels de fonction; Si les fonctions avec des variables libres sont de première classe, puis en retournant on crée une fermeture.

Comments are closed.