Zoeken…


Invoering

Van de StackOverflow- sluitingstag :

Een sluiting is een eersteklas functie die verwijst naar (sluit over) variabelen uit de scope waarin het werd gedefinieerd. Als de afsluiting nog steeds bestaat nadat het definiërende bereik is beëindigd, blijven de variabelen waarover deze sluit ook bestaan.

Opmerkingen

Het is soms handig om sluitingen en objecten als vergelijkbaar te beschouwen.

De eerbiedwaardige meester Qc Na liep met zijn student, Anton. In de hoop de meester in een discussie te brengen, zei Anton: "Meester, ik heb gehoord dat objecten iets heel goeds zijn - is dit waar?" Qc Na keek medelijdend naar zijn student en antwoordde: "Dwaze leerling - objecten zijn slechts de sluitingen van een arme man." Getuchtig nam Anton afscheid van zijn meester en keerde terug naar zijn cel, met de bedoeling sluitingen te bestuderen. Hij las aandachtig de hele reeks "Lambda: The Ultimate ..." -papieren en zijn neven en nichten en implementeerde een kleine tolk met een op sluiting gebaseerd objectsysteem. Hij leerde veel en keek ernaar uit zijn meester op de hoogte te houden van zijn vorderingen.

Tijdens zijn volgende wandeling met Qc Na probeerde Anton indruk te maken op zijn meester door te zeggen: "Meester, ik heb de zaak ijverig bestudeerd en begrijp nu dat objecten echt de sluitingen van een arme man zijn." Qc Na reageerde door Anton met zijn stok te slaan en te zeggen: "Wanneer leer je? Sluitingen zijn het voorwerp van een arme man." Op dat moment werd Anton verlicht.

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

Sluiting met statische omgeving

Een sluiting is een procedure die interne status heeft:

Definieer een procedure die een afsluiting retourneert

De procedure make-an-adder neemt één argument x en retourneert een functie die de waarde sluit. Of anders gezegd, x valt binnen het lexicale bereik van de geretourneerde functie.

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

Gebruik

Het aanroepen van de procedure make-an-adder retourneert een procedure die een afsluiting is.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow