racket
sluitingen
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