Hoi Roland,
Ach so, Du wolltest nur wissen, ob ich auch wirklich nirgendwo
eine Forward declaration habe?
Janz jenau ;-)
Wurde er im Fall einer Forward declaration aber auch nicht.
Nein, aber da wurde die Forward-Deklaration gemacht ;-)
Finde ich ueberhaupt nicht logisch. Was hat denn die syntaktische
Korrektheit der Funktionsdefinition fuer eine Relevanz fuer den
Prototypen?
Keine. Aber Perl wird in Schichten validiert, Prototypen-Fehler
muessen nicht zwingend Compile-Time-Fehler sein. Syntaktische Fehler
schon.
Ich benutze sie auch schon seit Anfang an, schliesslich komme ich
von C. ;-)
Dito.
Aber dass davon abgeraten wird, habe ich noch nicht gehoert.
Lediglich, dass man nicht wild und quer bestehende aeltere
Funktionen prototypen soll, auf deren Verhalten sich jemand an
anderer Stelle verlaesst (siehe dazu perlsub).
http://www.perl.com/pub/a/language/misc/fmproto.html
http://www.perl.com/pub/a/language/misc/bunce.html
Sie scheinen nicht ganz sauber implementiert zu sein.
Das wuerde zumindest dieses seltsame Verhalten ... also nicht
erklaeren, aber weniger verwunderlich machen.
Sie sind nachgeruestet worden, aus dem folgenden Grund:
Angenommen, man hat die Funktion sub x($). Und man ruft sie wie ein
Perl-Builtin auf:
@var = (x 1,1);
Mit einem Prototypen wird daraus
@var = (x(1),1);
Ohne wuerde daraus
@var = (x(1,1));
Das ist eigentlich kein Wuergaround ;-),
Solange mir das Verhalten keiner zweifelsfrei logisch erklaeren
kann, ist das fuer mich ein Bug. ;-)
Ich meine die Forward-Deklarationen. Sie sind kein Wuergaround. Sie
sind ein normales Sprachmittel.
sondern eine ganz normale
Methode; Funktionen mit Prototypen haben im Normalfall auch
Forward-Deklarationen.
Wieso das denn? Ich benutze Forwarddeklarationen praktisch nie,
Prototypen dagegen soweit moeglich immer.
Ich benutze Forward-Deklarationen *immer*.
Eigentlich braucht man sie (FwdDecl) nur, wenn zwei Funktionen
sich gegenseitig aufrufen. Evtl. noch, wenn man eine Funktion
verwendet, die erst zur Laufzeit nachgeladen wird und daher nicht
einfach vorher mit use aus einem Modul geholt werden kann. Oder
halt, wenn man diesem seltsamen Programmierstil froehnt, alle
Funktionen erst nach dem Hauptprogramm zu definieren. Aber wer
macht das schon ausser ein paar Unix-Hackern ... ;-)
So ziemlich viele Leute ;-)
Gruesse,
CK