Thread Gültigkeit von Variablen... oder so etwas. (30 answers)
Opened by theresa at 2008-02-18 13:44

KurtZ
 2008-02-20 17:56
#106148 #106148
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
murphy+2008-02-20 14:28:52--
Goto mit Parametern gibt's in Perl auch:

hmm ... stimmt ...habe ich bisher nur in Autoloadkonstrukten gesehen..

murphy+2008-02-20 14:28:52--
. wobei eine Continuation so etwas wie der eingefrorene Zustand eines Programmes ist, das darauf wartet einen Rückgabewert zu empfangen und weiterzurechnen.

Eine Statemachine?

murphy+2008-02-20 14:28:52--
.Man ersetzt also jede Rückgabe eines Wertes durch den Aufruf einer Funktion, die als Parameter übergeben wurde. Normaler Code:


Ok ich erkennen in deinem Code diverse Regeln:

1. Für benannte Sub ist $_[0] immer die Folgeroutine als code_ref (=def Continuation?)

2. Letzte Aktion statt eines Returns ist der Aufruf der Folgeroutine mittels
"goto &$_[0](args)"

3. Im einfachsten Fall erhält man eine lineare Kette von Aufrufen, $_[0] ist ein Code_ref auf den jeweilige Folgeroutine.

vereinfachtes Codebeispiel: [1]
statt

Code (perl): (dl )
1
2
3
sub1(); 
sub2();
sub3()


schreibt man

Code (perl): (dl )
sub1(\&sub2)


und in sub1 kommt als letztes eine übergabe von \&sub3 als Folgeroutine

Code (perl): (dl )
1
2
3
4
sub1 {
   ...
   $_[0]->(\&sub3) ;# => sub2(\&sub3)
}



4. will man eine Routinen verschachtelt aufrufen, [ wie im Bsp. mit Effekt say(square($x)) ] dann ruft die Oberroutine die Untere mit einer code_ref auf ein Closures der Oberoutine auf,
sodass die Unterroutine immer wieder die Kontrolle an die obere übergibt.

also statt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
sub subA {
  {block1}
  sub2();
  {block2}
  sub3()
  {block 3}
  return; 
} 


gibts

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub subA {
  $rc_contA=shift;

  $rc1= sub {block1; sub2( $rc2 ) }
  $rc2= sub {block2; sub3( $rc3 ) }
  $rc3= sub {block3; &$rc_contA; }

  $rc1->(); #aufruf
} 



OK ... ich kann mir vorstellen das man Statemachines damit gut und performant realisieren kann...

Hmm ...richtig schätzen würde man sowas aber erst wenn man entsprechende Design Patterns beherrscht.

Aber ist der Overhead für Routinenaufrufe wirklich so hoch, dass das lohnt?

Gruß
Kurt



[1] der Lesbarkeit willen hab ich auf Gotos verzichtet und die Folgeroutinen konventionell übergeben, was natürlich zu Stacküberläufen führen würde. Auch Argumente hab ich mal weggelassen. Der Codeablauf sollte klar werden.
TMTOWTDYOG (there's more than one way to dig your own grave)

View full thread Gültigkeit von Variablen... oder so etwas.