4 votes

Fermeture dans GO et variables locales

J'ai trouvé la définition suivante sur le site http://en.wikipedia.org/wiki/Closure_(informatique_sciences)

Dans les langages de programmation, une fermeture (également fermeture lexicale ou fonction fermeture lexicale) est une fonction ou une référence à une fonction avec un environnement de référencement une table stockant une référence à chacun des variables non locales (également appelées variables libres ou valeurs ascendantes) de ce fonction[1] Une fermeture, contrairement à un simple pointeur de fonction, permet à une fonction fonction d'accéder à ces variables non locales même lorsqu'elle est invoquée en dehors de son champ lexical immédiat.

Est-ce vrai en toutes occasions ? les fonctions lambda (celles qui créent une fermeture) ne peuvent-elles pas continuer à référencer des variables locales qui seraient hors de portée lorsque la lambda est appelée ? n'est-ce pas le comportement de GO ?


PS : Je me demande toujours pourquoi ils utilisent le terme "lambda".

J'ai obtenu la réponse à cette question https://cstheory.stackexchange.com/questions/18443/lambda-term-usage-in-programming


L'article suivant pourrait être utile à d'autres lecteurs,

Quelle est la différence entre une "fermeture" et un "lambda" ?

6voto

zzzz Points 23017

En citant le Spécification du langage Go :

Litraux de fonction

Un littéral de fonction représente une fonction anonyme.

FunctionLit = "func" Function .
func(a, b int, z float64) bool { return a*b < int(z) }

Un littéral de fonction peut être affecté à une variable ou invoqué directement.

f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)

Les littéraux de fonction sont des fermetures : ils peuvent faire référence à des variables définies dans une fonction environnante. Ces variables sont alors partagées entre la fonction environnante et le littéral de fonction, et elles survivent tant qu'elles sont accessibles.

Donc oui, en Go, la fermeture est garantie d'avoir accès à toute variable visible dans la portée où le littéral de la fonction a été défini. Le compilateur Go reconnaît les variables "capturées" dans une portée et les force vers le tas au lieu de la pile de contexte de définition (s'il y en a une - il peut aussi y avoir des fermetures TLD [top level declaration]).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X