Sök…


Introduktion

Från StackOverflow- stängningstaggen :

En nedläggning är en förstklassig funktion som hänvisar till (stänger över) variabler från omfattningen i vilken den definierades. Om nedläggningen fortfarande existerar efter att dess definierande räckvidd slutar, kommer variablerna som det stängs över att fortsätta att existera också.

Anmärkningar

Det är ibland användbart att betrakta stängningar och föremål som liknande.

Den värdefulla mästaren Qc Na promenerade med sin student, Anton. I hopp om att få befälhavaren till en diskussion sa Anton "Mästare, jag har hört att föremål är mycket bra - är det sant?" Qc Na såg medlidande på sin elev och svarade: "Dålig elev - föremål är bara en fattig mans stängning." Chastised, Anton tog sin ledighet från sin mästare och återvände till sin cell med avsikt att studera stängningar. Han läste noggrant hela "Lambda: The Ultimate ..." -serien med papper och dess kusiner och implementerade en liten Scheme-tolk med ett stängningsbaserat objekt-system. Han lärde sig mycket och såg fram emot att informera sin mästare om hans framsteg.

På sin nästa promenad med Qc Na försökte Anton imponera på sin mästare genom att säga "Mästare, jag har noggrant studerat saken och förstår nu att föremål verkligen är en fattig mans stängningar." Qc Na svarade genom att slå Anton med sin pinne och sa: "När kommer du att lära dig? Stängningar är en fattig mans föremål." I det ögonblicket blev Anton upplysta.

Källa: http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent

Stängning med statisk miljö

En stängning är ett förfarande som håller internt tillstånd:

Definiera en procedur som returnerar en stängning

Proceduren make-an-adder tar ett argument x och returnerar en funktion som stänger över värdet. Eller för att uttrycka det på ett annat sätt, x är inom den lexikala räckvidden för den returnerade funktionen.

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

Användande

Att ringa proceduren make-an-adder returnerar en procedur som är en stängning.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow