Closure (Funktion)

In der Informatik ist eine Schließung eine Funktion, die eine eigene Umgebung hat. In dieser Umgebung gibt es mindestens eine gebundene Variable (ein Name, der einen Wert hat, z.B. eine Zahl). Die Umgebung der Schließung hält die gebundenen Variablen zwischen den Verwendungen der Schließung im Speicher.

Peter J. Landin gab dieser Idee 1964 die Namensschließung. Die Programmiersprache Scheme machte Schließungen nach 1975 populär. Viele Programmiersprachen, die nach dieser Zeit entwickelt wurden, haben Schließungen.

Anonyme Funktionen (Funktionen ohne Namen) werden manchmal fälschlicherweise als Schließungen bezeichnet. Die meisten Sprachen, die anonyme Funktionen haben, haben auch Schließungen. Eine anonyme Funktion ist auch eine Schließung, wenn sie eine eigene Umgebung mit mindestens einer gebundenen Variablen hat. Eine anonyme Funktion ohne eigene Umgebung ist keine Schließung. Eine benannte Schließung ist keine anonyme Schließung.

Verschlüsse und erstklassige Funktionen

Werte können Zahlen oder eine andere Art von Daten sein, wie z.B. Buchstaben, oder Datenstrukturen, die aus einfacheren Teilen bestehen. In den Regeln einer Programmiersprache sind die erstklassigen Werte Werte, die an Funktionen gegeben, von Funktionen zurückgegeben und an einen Variablennamen gebunden werden können. Funktionen, die andere Funktionen annehmen oder zurückgeben, werden als Funktionen höherer Ordnung bezeichnet. Die meisten Sprachen, die Funktionen als erstklassige Werte haben, haben auch Funktionen und Schließungen höherer Ordnung.

Sehen Sie sich zum Beispiel die folgende Schemafunktion an:

Senden Sie eine Liste aller Bücher mit mindestens THRESHOLD verkauften Exemplaren zurück. (definieren (Bestseller-Schwelle) (Filter (Lambda (Buch) (>= (Buch-Verkaufs-Buch) Schwelle))      Buch-Liste)

In diesem Beispiel ist der Lambda-Ausdruck (Lambda (Buch) (>= (Buch-Verkaufs-Buch)-Schwelle)) Teil der Funktion Bestseller-Bücher. Wenn die Funktion ausgeführt wird, muss Scheme den Wert des Lambda machen. Dies geschieht, indem es einen Abschluss mit dem Code für das Lambda und einen Verweis auf die Schwellenwertvariable macht, die eine freie Variable innerhalb des Lambda ist. (Eine freie Variable ist ein Name, der nicht an einen Wert gebunden ist).

Die Filterfunktion führt dann den Abschluss für jedes Buch in der Liste aus, um die Bücher auszuwählen, die zurückgegeben werden sollen. Da der Abschluss selbst einen Verweis auf einen Schwellenwert hat, kann der Abschluss diesen Wert jedes Mal verwenden, wenn der Filter den Abschluss ausführt. Die Filterfunktion selbst kann in eine völlig separate Datei geschrieben werden.

Hier ist das gleiche Beispiel in ECMAScript (JavaScript) umgeschrieben, einer anderen populären Sprache mit Unterstützung für Schließungen:

// Rückgabe einer Liste aller Bücher mit mindestens 'Schwellenwert' verkauften Exemplaren. function bestSellBooks(threshold) { return bookList. filter( function(book) { return book. sales >= threshold; } ); }

ECMAScript verwendet hier das Wort function anstelle von lambda und die Methode Array.filter anstelle der Filterfunktion, aber ansonsten macht der Code das Gleiche auf die gleiche Weise.

Eine Funktion kann einen Abschluss erstellen und zurückgeben. Das folgende Beispiel ist eine Funktion, die eine Funktion zurückgibt.

Im Schema:

; Liefert eine Funktion, die die Ableitung von f annähert; unter Verwendung eines Intervalls von dx, das angemessen klein sein sollte. (definieren (Ableitung f dx) (lambda (x) (/ (- (f (+ x dx)) (f x)) dx))

In ECMAScript:

// Liefert eine Funktion, die die Ableitung von f // unter Verwendung eines Intervalls von dx approximiert, das angemessen klein sein sollte. function derivative(f, dx) { return function(x) { return (f(x + dx) - f(x)) / dx;    }; }

Die Abschlussumgebung behält die gebundenen Variablen f und dx bei, nachdem die umschließende Funktion (Ableitung) zurückgekehrt ist. In Sprachen ohne Closures würden diese Werte verloren gehen, nachdem die umschließende Funktion zurückkehrt. In Sprachen mit Closures muss eine gebundene Variable so lange im Speicher gehalten werden, wie jede Closure-Funktion sie hat.

Eine Schließung muss nicht durch eine anonyme Funktion gebildet werden. Die Programmiersprache Python beispielsweise unterstützt anonyme Funktionen nur begrenzt, verfügt aber über Abschlüsse. Eine Möglichkeit, das obige ECMAScript-Beispiel in Python zu implementieren, wäre zum Beispiel

# Gibt eine Funktion zurück, die die Ableitung von f # annähert, wobei ein Intervall von dx verwendet wird, das angemessen klein sein sollte. def Ableitung(f, dx): def Gradient(x): Rückgabe (f(x + dx) - f(x)) / dx Rücklaufgradient

In diesem Beispiel bildet die Funktion namens Gradient zusammen mit den Variablen f und dx einen Abschluss. Die äußere umschließende Funktion namens Ableitung gibt diese Schließung zurück. In diesem Fall würde auch eine anonyme Funktion funktionieren.

def-Ableitung(f, dx): Rückgabe Lambda x: (f(x + dx) - f(x)) / dx

Python muss stattdessen oft benannte Funktionen verwenden, weil seine Lambda-Ausdrücke nur andere Ausdrücke (Code, der einen Wert zurückgibt) und keine Anweisungen (Code, der Effekte, aber keinen Wert hat) enthalten dürfen. In anderen Sprachen, wie z.B. Scheme, gibt jedoch jeder Code einen Wert zurück; in Scheme ist alles ein Ausdruck.

Verwendung von Verschlüssen

Verschlüsse haben viele Verwendungsmöglichkeiten:

  • Entwickler von Software-Bibliotheken können den Benutzern die Möglichkeit geben, das Verhalten anzupassen, indem sie Schließungen als Argumente an wichtige Funktionen übergeben. Beispielsweise kann eine Funktion, die Werte sortiert, ein Schließungsargument akzeptieren, das die zu sortierenden Werte nach einem benutzerdefinierten Kriterium vergleicht.
  • Da Schließungen die Auswertung verzögern, d.h. sie "tun" nichts, bis sie aufgerufen werden, können sie zur Definition von Kontrollstrukturen verwendet werden. Beispielsweise werden alle Standard-Kontrollstrukturen von Smalltalk, einschließlich Verzweigungen (if/then/else) und Schleifen (while und for), mit Objekten definiert, deren Methoden Schließungen akzeptieren. Benutzer können problemlos auch ihre eigenen Kontrollstrukturen definieren.
  • Es können mehrere Funktionen erzeugt werden, die sich über der gleichen Umgebung schließen, so dass sie privat kommunizieren können, indem sie diese Umgebung verändern (in Sprachen, die eine Zuweisung ermöglichen).

Im Schema

(definiere foo #f) (definiere Takt #f) (let ((geheime Meldung "keine")) (set! foo (lambda (msg) (set! geheime Meldung msg))(set! bar (lambda () geheime Meldung))))) (display (bar))) ; druckt "keine" (Zeilenumbruch) (foo "triff mich um Mitternacht an den Docks") (display (bar)) ; druckt "triff mich um Mitternacht an den Docks
  • Verschlüsse können zur Implementierung von Objektsystemen verwendet werden.

Hinweis: Einige Referenten bezeichnen jede Datenstruktur, die eine lexikalische Umgebung bindet, als Abschluss, aber der Begriff bezieht sich in der Regel speziell auf Funktionen.

Fragen und Antworten

F: Was ist ein Abschluss in der Informatik?


A: Ein Closure ist eine Funktion, die eine eigene Umgebung hat.

F: Was enthält die Umgebung einer Closure?


A: Die Umgebung einer Closure enthält mindestens eine gebundene Variable.

F: Wer gab der Idee der Closure ihren Namen?


A: Peter J. Landin gab dem Konzept der Closures 1964 seinen Namen.

F: Welche Programmiersprache hat Closures nach 1975 populär gemacht?


A: Die Programmiersprache Scheme hat Closures nach 1975 populär gemacht.

F: Sind anonyme Funktionen und Closures das Gleiche?


A: Anonyme Funktionen werden manchmal fälschlicherweise als Closures bezeichnet, aber nicht alle anonymen Funktionen sind Closures.

F: Was macht eine anonyme Funktion zu einer Closure?


A: Eine anonyme Funktion ist eine Closure, wenn sie eine eigene Umgebung mit mindestens einer gebundenen Variablen hat.

F: Ist eine benannte Schließung anonym?


A: Nein, eine benannte Schließung ist nicht anonym.

AlegsaOnline.com - 2020 / 2023 - License CC3