Closures

 [Vorheriges Kapitel]  [Vorherige Seite]  [Inhaltsverzeichnis]  [Nächste Seite]  [Nächstes Kapitel]

counters.pl
my %counter = ();
while (<>) {
   chomp;
   next unless my ($name) = /^(\S+)$/;
   $counter{$name} = new_counter()
      unless defined $counter{$name};
   print &{$counter{$name}}(), "\n";
}

sub new_counter {
   my $counter = 0;
   return sub { return ++ $counter };
}

*Jedesmal, wenn sub { ... } bewertet wird, entsteht eine neue Inkarnation. Der Programmtext ist zwar konstant, nicht jedoch die jeweilige Umgebung.
 
*Auch wenn die Umgebung (zu der die umgebenden, mit my deklarierten Variablen gehören) längst verschwunden zu sein scheint, bleibt sie für die in ihr entstandenen anonymen Prozeduren erhalten.
 
*Die anonymen Prozeduren können dann auf den ererbten Variablen operieren.
 
*Diese Technik wurde durch Lisp bekannt unter dem Stichwort ``closures'', d.h. anonyme Prozeduren behalten ihre Hülle (oder Umgebung).
 

 [Vorheriges Kapitel]  [Vorherige Seite]  [Inhaltsverzeichnis]  [Nächste Seite]  [Nächstes Kapitel]
Copyright © 1996 - 2003 Andreas Borchert, in HTML konvertiert am 01.10.2003