racket
Verschlüsse
Suche…
Einführung
Aus dem StackOverflow- Schließtag :
Ein Abschluss ist eine erstklassige Funktion, die sich auf Variablen aus dem Gültigkeitsbereich bezieht, in dem sie definiert wurde. Wenn der Abschluss noch vorhanden ist, nachdem der definierende Gültigkeitsbereich beendet ist, bleiben die Variablen, die geschlossen werden, auch weiterhin vorhanden.
Bemerkungen
Es ist manchmal nützlich, Verschlüsse und Objekte als ähnlich zu betrachten.
Der ehrwürdige Meister Qc Na ging mit seinem Schüler Anton spazieren. In der Hoffnung, den Meister zu einer Diskussion anzuregen, sagte Anton: "Meister, ich habe gehört, dass Objekte eine sehr gute Sache sind - ist das wahr?" Qc Na sah seinen Schüler mitleidig an und antwortete: "Dummer Schüler - Objekte sind nur die Schließung eines armen Mannes." Der züchtigte Anton verabschiedete sich von seinem Herrn und kehrte in seine Zelle zurück, um Schließungen zu studieren. Er las die gesamte "Lambda: The Ultimate ..." - Papierserie und ihre Verwandten sorgfältig durch und implementierte einen kleinen Scheme-Interpreter mit einem schließbasierten Objektsystem. Er lernte viel und freute sich darauf, seinen Meister über seine Fortschritte zu informieren.
Bei seinem nächsten Gang mit Qc Na versuchte Anton seinen Meister zu beeindrucken, indem er sagte: "Meister, ich habe die Angelegenheit sorgfältig studiert und verstehe jetzt, dass Objekte wirklich die Schließungen eines armen Mannes sind." Qc Na antwortete, indem er Anton mit seinem Stock schlug und sagte: "Wann werden Sie lernen? Verschlüsse sind ein Objekt eines armen Mannes." In diesem Moment wurde Anton erleuchtet.
Quelle: http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
Schließung mit statischer Umgebung
Eine Schließung ist eine Prozedur, die den internen Zustand hat:
Definieren Sie eine Prozedur, die eine Schließung zurückgibt
Die Prozedur make-an-adder
nimmt ein Argument x
und gibt eine Funktion zurück, die den Wert schließt. Oder anders ausgedrückt: x
liegt im lexikalischen Bereich der zurückgegebenen Funktion.
#lang racket
(define (make-an-adder x)
(lambda (y)
(+ y x)))
Verwendungszweck
Beim Aufruf der Prozedur make-an-adder
eine Prozedur zurückgegeben, die eine Schließung darstellt.
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