Thread Automatisches Warning bei falschem Kontext für Funktion
(15 answers)
Opened by LanX- at 2009-06-03 16:49 2009-06-05T01:04:20 topeg Das ist jetzt eine leicht andere Zielsetzung, beim einzelnen return wird festgelegt was zurück gegeben werden darf. Da es oft Subs mit mehreren Returns gibt, IMHO eher weniger usecases als gleich die ganze Routine (Z.B. mit Attributen) einzuschränken. Aber man könnte es für SidBurns Technik nutzen Arrays im Zweifels als Refs zurückzugeben. Die sauberste Methode für modifizierte Returns ist IMHO Code (perl): (dl
)
1 2 3 4 5 6 7 8 sub test { return LIST(@dummy); } sub LIST{ carp ("wrong context") unless wantarray; return @_; } da dies aber einen neuen Callframe für LIST erzeugt könnte man (uneleganter aber viel performanter) schreiben: Code (perl): (dl
)
1 2 3 4 5 6 7 8 sub test { goto RETURN-LIST(@dummy); } sub RETURN-LIST{ carp ("wrong context") unless wantarray; return @_; } um das jetzt eleganter hinzubekommen, könnte man einen sourcefilter nutzen, der ausschließlich "return-l" mit "goto RETURN-LIST" ersetzt. Beachte das der Parser keine zusätzlichen Komplikationen hat, was hinter "return-l" kommt ist egal (Liste, Klammerung, Semikolon, Kommentar ...). Wie erstellt man nun diesen Codefilter narrensicher? Meine Lieblingsmethode wird in Perl-Hacks beschrieben, (Perl Hacks (eng) #47 S116) da werden nur einzelne Subs NACH dem Kompilieren durch Deparse gejagt und dann ersetzt und neu evaluiert. D.h wenn ich vorweg eine normale Methode return-l() vordeklariere wird der compiler diese nur greifen wenn sie syntaktisch richtig gegriffen wurde!!! (also nicht in einem String "return-l" oder so) Dann deparse ich den Code wieder und ersetze NUR die Stellen wo eine Methode return-l erkannt wurde udn reevaluiere den Code. Nachteil: Deparse ist nicht immer zuverlässig und es ist etwas durch Knie geschossen den Code wieder zu evaluieren. PERFEKT wäre eine generelle MACRO-technologie die direkt den Opcode für call return-l() mit goto RETURN-LIST() ersetzt. Hatte schon mal angefangen sowas anzudenken und es bei den Mönchen diskutiert, aber vor der Opcodeebene hab ich noch mächtig Respekt... Alle Codebeispiele ungetestet 2009-06-05T01:04:20 topeg Ganz ehrlich, für mich schon einen Tick zu komplex um ihn zu trauen... Last edited: 2009-06-05 13:23:08 +0200 (CEST) me and my writeups
|