Ricerca…


introduzione

Dal tag di chiusura StackOverflow:

Una chiusura è una funzione di prima classe che fa riferimento a (chiude sopra) le variabili dall'ambito in cui è stata definita. Se la chiusura esiste ancora dopo la fine del suo ambito di definizione, anche le variabili che chiude sopra continueranno ad esistere.

Osservazioni

A volte è utile considerare le chiusure e gli oggetti come simili.

Il venerabile maestro Qc Na stava camminando con il suo studente, Anton. Sperando di spingere il maestro in una discussione, Anton ha detto: "Maestro, ho sentito dire che gli oggetti sono un'ottima cosa - è vero?" Qc Na guardò il suo allievo con compassione e rispose: "Pupilla pupilla - gli oggetti sono solo le chiusure di un povero." Chastised, Anton si congedò dal suo padrone e tornò nella sua cella, intento a studiare chiusure. Lesse attentamente l'intera serie di carte "Lambda: The Ultimate ..." e i suoi cugini, e implementò un piccolo interprete Scheme con un sistema di oggetti basato sulla chiusura. Ha imparato molto e non vede l'ora di informare il suo maestro dei suoi progressi.

Nella sua prossima passeggiata con Qc Na, Anton ha tentato di impressionare il suo maestro dicendo "Maestro, ho diligentemente studiato la questione, e ora capisco che gli oggetti sono veramente le chiusure di un povero uomo". Qc Na ha risposto colpendo Anton con il suo bastone, dicendo "Quando imparerai? Le chiusure sono un oggetto da povero uomo". In quel momento, Anton si illuminò.

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

Chiusura con ambiente statico

Una chiusura è una procedura che mantiene lo stato interno:

Definire una procedura che restituisce una chiusura

La procedura make-an-adder accetta un argomento x e restituisce una funzione che si chiude sopra il valore. O per dirla in altro modo, x è all'interno dell'ambito lessicale della funzione restituita.

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

uso

Chiamando la procedura make-an-adder restituisce una procedura che è una chiusura.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow