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.