Anonyme Funktion

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Anonyme Subroutine)
Wechseln zu: Navigation, Suche

Eine anonyme Funktion oder Lambda-Funktion ist eine Funktion in einem Computerprogramm, die nicht über ihren Namen, sondern nur über Verweise wie Referenzen oder Zeiger angesprochen werden kann.

Benannte Funktionen[Bearbeiten]

Das Konzept benannter Funktionen ist aus praktisch jeder verbreiteten Programmiersprache bekannt: Eine Funktion erhält bei ihrer Deklaration einen eindeutigen Namen, unter dem sie anschließend angesprochen wird.

Beispiel in Perl
# Deklaration und Definition der Funktion
sub benannteFunktion
  {
  ... Code ...
  }
 
# Aufruf der Funktion
benannteFunktion( ... );

Der Name der Funktion wird vom Laufzeitsystem dazu verwendet, mit Hilfe der Symboltabelle oder eines dynamischen Verfahrens die Funktionsdefinition zu identifizieren und dort hinterlegten Code auszuführen.

Beispiel in C++ bzw. C
// Deklaration und Definition
int funktion_mit_name(void)
{
    // ...Code...
}

In kompilierten Sprachen wie C oder C++ löst prinzipiell ähnlich bereits der Linker die Namen nicht-virtueller Funktionen auf.

Anonyme Funktionen[Bearbeiten]

Mit dem Konzept anonymer Funktionen ist es möglich, neben benannten auch unbenannte Funktionen zu definieren.

Beispiel in Common Lisp
(lambda (x) (* x 2))

Um diese Funktion, die einen Wert verdoppelt, im selben Zug zu verwenden, kann sie in Funktionsposition direkt auf das beispielhafte Argument 5 angewendet werden:

((lambda (x) (* x 2)) 5)

Worauf das Lisp-System mit

10

antwortet. Danach kommt die Funktionsdefinition, da sie nicht an ein Symbol gebunden ist, zum Garbage.

Beispiel in Perl
# Deklaration und Definition der Funktion und Zuweisung an eine (Referenz-)Variable
my $funktionsReferenz = sub { ... };
 
# Aufruf der Funktion
$funktionsReferenz->( ... );

Da die Funktion hierbei keinen Namen hat, ist ein symbolischer Aufruf nicht mehr möglich. Sie wird vielmehr über eine Referenz, einen Verweis auf die Definition, indirekt angesprochen.

Beispiel in D
auto funktions_referenz = delegate int(string str){ int x; /*...*/ return x; };
 
funktions_referenz("Hallo Welt!");

Anonyme Funktionen können die Programmierung kontextabhängiger Funktionsaufrufe sehr stark vereinfachen. Darüber hinaus ermöglichen sie die einfache Verwendung von Funktionsreferenzen als Funktionsargumente, beispielsweise zur Übergabe einer Rückruffunktion (callback), und die Speicherung in Datenstrukturen.

Beispiele in C++11
[capture](params) -> ret { body };
  • capture: Übertrag der angegebenen Variablen in den Gültigkeitsbereich des Lambda-Ausdrucks
  • params: Übergabeparameter
  • -> ret: Rückgabetyp (optional; Pfeil erforderlich)
  • body: Funktionsrumpf
// Da fast jede Lambda-Funktion einen anderen Typ hat, wird ein Funktionstemplate verwendet:
template<typename LambdaTyp>
void rueckrufendeFunktion(LambdaTyp anonyme_funktion)
{
    anonyme_funktion();
}
 
int main()
{
    auto fun = []{ ... };
 
    rueckrufendeFunktion(fun);
 
    return 0;
}

Das verwandte Konzept der Funktionszeiger in den Programmiersprachen C bietet ähnliche Möglichkeiten, ist aber aufgrund seiner Syntax nicht trivial in der Anwendung. Zudem bleibt dort die eigentliche Funktion gleich benannt, separat definierte Verweise darauf können aber beliebige Namen tragen.

In C++ können Funktionszeiger durch Lambda-Audrücke ersetzt werden, die, wie in den Beispielen gezeigt, ähnlich wie in Perl oder anderen Sprachen genutzt werden können.

In Java können für diesen Zweck anonyme innere Klassen[1] und ab Version 8 Closures[2] verwendet werden.

Anonyme Funktionen werden von den meisten Skriptsprachen unterstützt, beispielsweise von Perl, Python, Lisp und – in neueren Versionen – von JavaScript und JScript.

Einzelnachweise[Bearbeiten]

  1.  Christian Ullenboom: Java ist auch eine Insel. 10., aktualisierte Auflage. Galileo Press, Bonn 2012, ISBN 978-3-8362-1802-3, 7.5 Anonyme innere Klassen.
  2. (hs): Project Lambda: So werden Closures in Java 8 aussehen. In: JAXenter. it republik, 9. September 2011, abgerufen am 19. September 2011.

Weblinks[Bearbeiten]