[Roma.pm] xml + tag name

Oha oha at oha.it
Tue Jul 24 03:09:48 PDT 2007


>efficiente, visto che Perl non ha la tail recursion optimization 

a quanto ricordo, la tail recursion e' applicabile solo se la ricorsione e' loop-invariant

se ricordo bene, quindi, in questo caso la ricorsione avviene piu' volte per ogni stato dello stack, e non sarebbe dunque possibile fare tail recursion.

la soluzione di usare un loop (push su una pila di di cose "da fare") a sua volta potrebbe non esser efficiente (per grandi strutture dati, la pila potre diventare enorme)

una soluzione e' farsi un vero e proprio stack applicativo, mi capito' di scrivere codice del genere in C usando puntatori a struct. senza usare OOP un esempio in perl e' quanto segue:

$ref = XMLin('<opt><a/><b><b1 d="0"/></b><c><c1/></c></opt>');

my @stack = ([$ref, [keys %$ref]]);

my $sp = 0;
while($sp>=0)
{
        my $r = $stack[$sp][0];
        my $next = shift @{$stack[$sp][1]};
        if($next)
        {
                print "child $next...n";
                $sp++;
                my $r2 = $r->{$next};
                $stack[$sp] = [$r2, [keys %$r2]];
        }
        else
        {
                $sp--;
        }
}

ogni elemento di @stack contiene lo "stato" dello stack in quel punto. la "shift" simula un ciclo prelevando il prossimo elemento nella lista di cose da fare, e $sp (come potra' suggerire il nome) e' lo stack pointer.

Oha 



More information about the Roma mailing list