Anonyme Subroutine
aus Wikipedia, der freien Enzyklopädie
Anonyme Subroutine beschreibt eine Funktion eines Computerprogramms, die nicht über ihren Namen, sondern ausschließlich über Verweise (Referenzen, Zeiger, etc.) angesprochen werden kann.
Das Konzept benannter Funktionen ist aus praktisch jeder verbreiteten Programmiersprache bekannt: Eine Funktion erhält bei ihrer Definition einen eindeutigen Namen, über den man sie anschließend aufruft.
Beispiel in Perl: # definition sub named {...} # call named(...);
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, in compilierten Sprachen löst prinzipiell ähnlich bereits der Linker die Namen nichtvirtueller Funktionen auf.
Mit dem Konzept der anonymen Subroutine wird es nun möglich, neben solchen benannten auch unbenannte Funktionen zu definieren.
Beispiel in Perl: # definition my $subref=sub {...} # invocation $subref->(...);
Da die Funktion keinen Namen mehr hat, ist ein symbolischer Aufruf nicht mehr möglich, die Routine wird vielmehr über eine Referenz, also einen Verweis auf die Definition, indirekt gestartet.
Anonyme Subroutinen können die Programmierung kontextabhängiger Funktionsaufrufe sehr stark vereinfachen. Darüber hinaus ermöglichen sie die einfache Verwendung von Funktionsreferenzen als Funktionsparameter (Übergabe eines Rückrufs (callback)) und die Speicherung in Datenstrukturen.
Beispiele in Perl # pass a callback doSomething(callback => sub {...}, ...); # store subrefs in a hash my calls=( quick => sub {...}, clean => sub {...}, dirty => sub {...}, ... );
Das verwandte Konzept der Funktionszeiger in C oder C++ bietet prinzipiell ähnliche Möglichkeiten, ist aber aufgrund seiner Syntax und verschiedener Sonderregeln sehr viel komplizierter in der Anwendung und alles andere als intuitiv. Darüberhinaus bleiben die eigentlichen Funktionen dabei weiterhin benannt, man legt lediglich zusätzliche Verweise darauf an.
Java verwendet für diesen Zweck so genannte anonyme Inline-Klassen, oft vom typ Runnable, und das so genannte Listener-Pattern zur Ereignisbehandlung.
Anonyme Subroutinen werden von den meisten Scriptsprachen unterstützt, zum Beispiel Perl, Python und Lisp.