Schrift
[thread]5922[/thread]

Callbacks und Closures?: Kann mal einer was dazu erzählen.

Leser: 1


<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten
Ronnie
 2003-11-23 22:15
#72629 #72629
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Kann mir mal jemand was zum Thema Callbacks und Closures erzählen? Ich verstehe das ganze Themengebiet irgendwie nicht, und die fremdsprachige Doku durch die ich mich gequält habe, hatte nur merkwürdige Beispiele.

Also was bedeuten die Begriffe und für was ist es gut?
format_c
 2003-11-24 00:04
#72630 #72630
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
MMh die Defninitionen sind auch im Deutschen nicht besser.
Ich versuch es dir mal mit File::Find zu veranschaulichen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

# find mit Closure
find(sub {print if /\.pl$/;},'.');


# find mit Callback
find(\&wanted,'.');

sub wanted {
print if /\.pl$/;
}


Das ist eigentlich der Unterschied von Closure zu Callback
Ja man kann sagen, dass Closures einfach anonyme Subroutinen ein einem bestimmen lexikalischen Geltungsbereich sind.

Callbacks sind halt Referenzen auf Sub-Routinen.

Gruß Alex
kabel
 2003-11-24 00:05
#72631 #72631
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
ich versuche mich mal:

callback := funktion, die eine von dir erwünschte funktionalität implementiert. z.b. die wanted funktion aus File::Find ist ein callback; das C qsort (man 3) braucht, um zwei elemente vergleichen zu können, eine vergleichsfunktion, etc.

Code: (dl )
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));

compar ist ein callback.

closure := funktion, die zugriff auf variablen hat, die nicht im funktionsblock liegen. z.b.

Code: (dl )
{ my $a; sub inc { ++$a } }
-- stefan
Strat
 2003-11-24 01:28
#72632 #72632
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
hier ein ausschnitt aus meiner doku fuer "fortgeschrittene Perl-Programmierung":
Quote
Strat, Fortgeschrittene Perl-Programmierung
Closures
Eine my-Variable ist nur in dem Block { } (und untergeordneten) gültig, in dem sie deklariert wurde, und ist von außerhalb unsichtbar.
In Perl kann man Blöcke schachteln, und auch beliebige leere Blöcke anlegen.
In einen leeren Block kann man auch Subroutinen reinschreiben
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
01: #! /usr/bin/perl
02: use warnings;
03: use strict;
04: 
05: # ============================================================
06: { # Beginn der Closure
07:     my $counter = 0;
08:     # ------------------------------------------------------------
09:     sub ZaehleHoch {
10:         $counter++;
11:     } # ZaehleHoch
12:     # ------------------------------------------------------------
13:     sub ZaehleRunter {
14:         $counter--;
15:     } # ZaehleRunter
16:     # ------------------------------------------------------------
17:     sub GibMirDenCounterWert {
18:         return $counter;
19:     } # GibMirDenCounterWert
20:     # ------------------------------------------------------------
21: 
22: } # Ende der Closure
23: # ============================================================
24: 
25: print &GibMirDenCounterWert(), "\n";
26: for my $i (1..20) {
27:     &ZaehleHoch();
28: } # for
29: print &GibMirDenCounterWert(), "\n";
30: for my $i (4..9) {
31:     &ZaehleRunter();
32: } # for
33: print &GibMirDenCounterWert(), "\n";

Zeile 6-22: dies ist ein leerer Block, in den eine Variable $counter und einige Subroutinen eingeschlossen sind. Die Variable ist nur innerhalb des Blockes sichtbar, nicht jedoch außerhalb. Es sind auch einige Subroutinen eingeschlossen. Da Subroutinen jedoch immer global sind, sind sie auch von außen sichtbar und somit ausführbar. Und sie haben zusätzlich Zugriff auf die Variable $counter.

Achtung: der Block mit der Closure muß immer vor dem Code kommen, weil sonst die Zeile my $counter = 0; nicht ausgeführt würde, und somit die Variable $counter zwar deklariert, aber noch nicht initialisiert wäre, und sich use warnings; ueber einen nicht-initialisierten Wert beschweren würde, wenn das &GibMirDenCounterWert() in der Zeile 25 z.B. in der Zeile 4 schon ausgeführt würde.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ronnie
 2003-11-25 17:49
#72633 #72633
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=kabel,23.11.2003, 23:05]closure := funktion, die zugriff auf variablen hat, die nicht im funktionsblock liegen. z.b.[/quote]
Sind das nich die meisten Funktionen, die auf globale Variablen zugreifen?

EDIT1: Ah, der Clou ist das die Variable in einem umschließenden lexikalischen Kontext sein kann, sie aber nicht global einsehbar ist. Richtig?\n\n

<!--EDIT|Ronnie|1069775568-->
Strat
 2003-11-25 17:58
#72634 #72634
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
richtig; wobei der umschliessende kontext aber auch eine datei sein kann, hauptsache, man verwendet my-variablen
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kabel
 2003-11-26 08:34
#72635 #72635
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
wenn du in perl nur lexikalische variablen verwendest, kannst du dir ein schönes modell dazu vorstellen, das umgebungsmodell.

beim umgebungsmodell gibt es am anfang eine große, das ganze skript überziehende umgebung, in der du mittels blöcken weitere ebenen "draufpacken" (schachteln kannst). jede obenliegende umgebung hat zugriff auf die unterliegende, die umgekehrte richtung gilt nicht. wenn du in einer höherliegenden umgebung eine variable definierst, deren name schon weiter unten gebraucht ist, dann wird der unterliegende name verschattet/verdeckt.

im querschnitt sieht meine gepostete closure dann so aus:

------------- (subroutine)
--------------- (block/umgebung, der definition von $a enthält)
~---------------------------------------~ (skript)


leserichtung von oben nach unten. es gibt natürlich perl-spezifisches, dass dieses konzept durchbricht; bei benutzung musst du einfach selber wissen, ob du das wirklich brauchst; oder nur denkst zu brauchen.

HTH\n\n

<!--EDIT|kabel|1069828520-->
-- stefan
Cremator
 2003-11-28 20:19
#72636 #72636
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Ich muss zugeben Closures ist ein Konzept in Perl das ich auch fuer voellig geisteskrank und (mittlerweile) mehr als fluessig halte. Ich zitiere mal das Beispiel aus dem Kamel-Buch fuer diejenigen die es nicht haben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub newprint {
   my $x = shift;
   return sub {
       my $y = shift;
       print "$x, $y!\n";
   }
}
$h = newprint('Howdy');
$g = newprint('Greetings');

# ...

&$h('world');  # Ausgabe: Howdy, world!
&$g('earthlings');   # Ausgabe: Greetings, earthlings!


Also nur ein umstaendlicher Weg sich Variablen zu bauen die man nicht mehr veraendern kann. Scheint ein Ueberbleibsel von frueheren Perl-Versionen zu sein als es "use constant" noch nicht gab.

Sonst sehe ich keinen rechten Sinn darin. Kann mir irgendjemand eine sinnvolle Anwendung dieses Variablengewurschtels von Closures nennen? Das Counter-Beispiel von Strat ist zwar ganz nett, aber wenn man auf Datenkapselung wert legt wuerde man das doch eher als OOP-Modul bauen, oder nicht?


Edit renee: quote- durch code-Tags ersetzt\n\n

<!--EDIT|renee|1070285545-->
Cremator
 2003-11-28 20:20
#72637 #72637
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Arrgl.. Emos vergesen abzuschalten

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub newprint {
   my $x = shift;
   return sub {
       my $y = shift;
       print "$x, $y!\n";
   }
}
$h = newprint('Howdy');
$g = newprint('Greetings');

# ...

&$h('world');  # Ausgabe: Howdy, world!
&$g('earthlings');   # Ausgabe: Greetings, earthlings!

Edit renee: quote- durch code-tags ersetzt, um smileys zu verhindern...\n\n

<!--EDIT|renee|1070285488-->
Cremator
 2003-11-28 20:21
#72638 #72638
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Ich geb's auf.. Erst mal Profil umstellen.
<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten



View all threads created 2003-11-23 22:15.