Recherche…


Introduction

De la balise de fermeture StackOverflow:

Une fermeture est une fonction de première classe qui fait référence aux variables (se ferme) à partir de la portée dans laquelle elle a été définie. Si la fermeture existe toujours après la fin de sa portée, les variables qu'elle ferme finissent également par exister.

Remarques

Il est parfois utile de considérer les fermetures et les objets comme étant similaires.

Le vénérable maître Qc Na se promenait avec son élève, Anton. Espérant inviter le maître dans une discussion, Anton dit "Maître, j'ai entendu dire que les objets sont une très bonne chose - est-ce vrai?" Qc Na a regardé avec pitié son élève et a répondu: "Élève stupide - les objets ne sont que les fermetures d'un pauvre homme." Anton, pris avec précaution, quitta son maître et retourna dans sa cellule pour étudier les fermetures. Il a soigneusement lu l'intégralité de la série d'articles "Lambda: The Ultimate ..." et de ses cousins, et a implémenté un petit interpréteur Scheme avec un système d'objet basé sur la fermeture. Il a beaucoup appris et a hâte d’informer son maître de ses progrès.

Lors de sa prochaine promenade avec Qc Na, Anton a tenté d'impressionner son maître en disant: "Maître, j'ai étudié la question avec diligence et je comprends maintenant que les objets sont vraiment les fermetures d'un pauvre." Qc Na a répondu en frappant Anton avec son bâton, en disant "Quand allez-vous apprendre? Les fermetures sont l'objet d'un pauvre homme." À ce moment, Anton s'est éclairé.

Source: http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent

Fermeture avec environnement statique

Une fermeture est une procédure qui contient un état interne:

Définir une procédure qui renvoie une fermeture

La procédure make-an-adder prend un argument x et retourne une fonction qui se ferme sur la valeur. Ou, en d'autres termes, x est dans la portée lexicale de la fonction renvoyée.

#lang racket
(define (make-an-adder x)
  (lambda (y)
    (+ y x)))

Usage

L'appel de la procédure make-an-adder renvoie une procédure qui est une fermeture.

Welcome to DrRacket, version 6.6 [3m].
Language: racket, with debugging; memory limit: 128 MB.
> (define 3adder (make-an-adder 3))
> (3adder 4)
7
> (define 8adder (make-an-adder 8))
> (8adder 4)
12


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow