Schrift
[thread]5922[/thread]

Callbacks und Closures?: Kann mal einer was dazu erzählen. (Seite 2)

Leser: 1


<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten
pq
 2003-11-28 20:31
#72639 #72639
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Cremator,28.11.2003, 19:19]Ich muss zugeben Closures ist ein Konzept in Perl das ich auch fuer voellig geisteskrank und (mittlerweile) mehr als fluessig halte.[/quote]
du meinst überflüssig?
Quote
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.

nein, es geht z.b. auch um variablen, die nicht von anderen programmteilen
verändert werden dürfen, aber gerne von der subroutine selbst. lies einfach
mal damians OO-perl-buch, da werden closures auch behandelt. ich mag
closures...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ptk
 2003-11-28 20:50
#72640 #72640
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Cremator,28.Nov..2003, 19:19]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:
Quote
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.
[/quote]

Aehm, hast du schon mal geguckt, wie Konstanten in constant.pm
realisiert werden? Genau, mit Closures.

Quote
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?


Es ist eine grandiose Sache, ein Stueck Codereferenz mit sich
herumtragen zu koennen und nicht auf Variablenscopes achten zu
muessen. Etwas, um das dich jeder C-Programmierer (und
wahrscheinlich 98% aller anderer Programmiersprachen) beneiden
muessten.

Ich benutze Closures hauptsaechlich fuer Callbacks in Tk-Bindings.
Oder auch fuer Subroutinen innerhalb von Subroutinen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub aussen {
# viele Variablen werden hier verwendet
my $innen = sub {
# viele Variablen aus "aussen" werden hier verwendet, aber
# muessen nicht uebergeben werden
};

while(...) {
$innen->();
}
}
Cremator
 2003-11-28 21:10
#72641 #72641
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Oehm.. Nein constant.pm hab ich mir noch nicht angeschaut. Werde das jetzt nachholen.

Gut die Anwendungen moegen Ihre Berechtigung haben, als anonyme sub fuer z.B. sort oder anderen Callback ist es vertretbar (die benutze ich auch oefters). Aber ich versuche solche Dinge wie verschachtelte Subs groesstenteils zu vermeiden, da ich sie weder fuer intuitiv noch syntaktisch fuer sonderlich schoen halte. Da gebe ich leicht verstaendlichem Code doch den Vorzug, auch wenn es etwas weniger performant ist.
ptk
 2003-11-28 21:45
#72642 #72642
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Die Alternative zu verschachtelten subs ist: gleiche Bloecke werden per copy'n'paste dupliziert (unschoen) oder der Block wird als eine eigene (aussenliegende) Subroutine geschrieben und man muss den ganzen Kontext an diese Subroutine uebergeben. Auch unschoen, besonders wenn es sich um eine kritische Loop handelt und viele Variablen uebergeben werden muessen.
Cremator
 2003-11-28 22:04
#72643 #72643
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Quote
... besonders wenn es sich um eine kritische Loop handelt und viele Variablen uebergeben werden muessen.

Dann handelt es sich meist um einen Designfehler, denn die sub macht einfach zuviel. Aufteilen in mehrere (aussenliegende) "Call by Reference"-Subs.

Sorry, aber den konnte ich mir nun wirklich nicht verkneifen ;)
ptk
 2003-11-28 22:46
#72644 #72644
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Cremator,28.Nov..2003, 21:04]
Quote
... besonders wenn es sich um eine kritische Loop handelt und viele Variablen uebergeben werden muessen.

Dann handelt es sich meist um einen Designfehler, denn die sub macht einfach zuviel. Aufteilen in mehrere (aussenliegende) "Call by Reference"-Subs.
[/quote]

Was soll das aendern? Die Variablen werden gebraucht und muessen so oder so uebergeben werden, sei es an nur eine oder an mehrere Subs. Und jeder Parameter kostet was, auch wenn es nur eine Referenz ist. Ach ja, und geht hier nicht nur um die Variablenuebergabe, sondern auch die Rueckgabewerte.

Natuerlich kann man auch ohne Closures auskommen. Manche Leute kommen angeblich mit Basic, Fortran oder C klar. Aber ich bezweifle, dass sie genauso viel Spass dabei haben :-)
Cremator
 2003-11-28 23:27
#72645 #72645
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Es aendert sich soweit das man den Code leichter versteht (besonders wenn man fremden Code bearbeiten muss). Sicher kostet die Uebergabe etwas, aber wie ich schon sagte bin ich gerne dazu bereit, diesen "Nachteil" einzugehen, wenn alle die daran arbeiten muessen in einem halben Jahr noch wissen was da passiert, ohne gross rumsuchen und ueberlegen zu muessen.

Ja, ich gebe zu ich bin ein OOP-geschaedigter, der dann lieber eine neue Memberfunktion anlegt.

Einigen wir uns einfach darauf, das es sich um eine philosophische Frage zu persoenlichen Vorlieben handelt, deren Diskussion (wie vieles zu Vorlieben) muessig ist. Schoen das das Feature da ist, aber man muss es halt nicht nutzen - TIMTOWTDI :)

Quote
Manche Leute kommen angeblich mit Basic, Fortran oder C klar. Aber ich bezweifle, dass sie genauso viel Spass dabei haben :-)

Iik! Die Vorstellung mit Basic arbeiten zu muessen ist wirklich gruselig. ;)
Crian
 2003-11-29 16:28
#72646 #72646
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=Cremator,28.11.2003, 22:27]
Quote
Manche Leute kommen angeblich mit Basic, Fortran oder C klar. Aber ich bezweifle, dass sie genauso viel Spass dabei haben :-)

Iik! Die Vorstellung mit Basic arbeiten zu muessen ist wirklich gruselig. ;)[/quote]
Ja *schauder* - allerdings soll das Visual Basic eine ziemlich aufgebohrte Variante sein.... trotzdem ^^

Zum Spass ... es kommt auf die Reihenfolge an ... bei mir Basic (auf dem C64 falls das jemandem noch was sagt, es gab keine Funktionen, nur Gosub Zeilennummer ...), (Turbo) Pascal, Fortran 77, C, C++, C++ & MFC, Perl.

Und ich habe in jeder Sprache mit Spaß und Feuereifer programmiert ... müsste ich den Weg jetzt allerdings zurückgehen, würde ich spätestens nach C die Bremse ziehen ^^

Obwohl ... arithmetisches If... verwirrende Common-Blöcke ... ^^ *klingtverlockend* *fg
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Cremator
 2003-11-29 18:19
#72647 #72647
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Quote
bei mir Basic (auf dem C64 falls das jemandem noch was sagt, es gab keine Funktionen, nur Gosub Zeilennummer ...), (Turbo) Pascal, Fortran 77, C, C++, C++ & MFC, Perl.


Na da kann ich ja noch grade so mithalten. Basic auf dem VC-20, Assembler auf dem C64, (Turbo/Borland) Pascal, Erste OOP-Versuche mit Borland Pascal & Turbo Vision, 80x86 Assembler, C++ & MFC, JavaScript :D, Perl und gelegentlich noch etwas VBScript und VTML um meinen Editor weiter zu automatisieren.
Crian
 2003-11-29 19:15
#72648 #72648
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Stimmt, auf dem VC-20 war eigentlich bei mir auch der Erstkontakt zur Programmierung (und damit haben mein Vater und ich damals meiner Mutter ein Weihnachten versaut ;-)...


HTML / JavaScript hab ich mal weggelassen ;)

Es ging auch nicht darum heraushängen zu lassen, was ich schon alles gemacht hab (da gibts eh einige hier die noch läger dabei sind oder noch mehr verschiedenes gemacht haben), sondern auszudrücken, dass man auch in anderen Sprachen mit viel Spaß programmieren kann (oder jedenfalls konnte, da man die vielen Bequemlichkeiten von Perl ja noch nicht kannte...). :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten



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