[bcn-pm] programilla Perl, inutil pero divertido

Jordi Delgado jdelgado a lsi.upc.edu
dic jul 15 05:03:38 PDT 2009


Hola,

Gracias Jose Luis, pero lo que tu has hecho no es exactamente lo
que yo queria hacer, que es conseguir una funcion que se auto-modificara
en tiempo de ejecucion (aunque si que es bizarro, si).

Sin embargo, gracias al deparse que utilizas puedo hacer lo que queria:

----------------------------------------------------

use B::Deparse;

sub costly {
  return $_[0] + 1;
}

sub memoize_funny {
    my $param = shift;
    if (1) {
	my $result = &costly($param);
	print "Computing costly... $result\n";
	my $deparse= B::Deparse->new();
	$_ = $deparse->coderef2text(\&memoize_funny);
	s/(.*)do/$1if (1)/; # This is because the initial 'if (1)' 
                            # is deparsed as a 'do '
	s/(.*)if /$1if (\$param == $param) { print "cheap: $result\\n" } elsif /;
	eval "sub memoize_funny $_"; 
    }
};


while (<STDIN>) {  ## exit with ctrl + d
  chomp;
  &memoize_funny($_);
}

## To see how the program has been modified...
my $deparse= B::Deparse->new();
$_ = $deparse->coderef2text(\&memoize_funny);
print;

----------------------------------------------------

Bueno, pues eso... que casi es la hora de comer, ahora no te pondras a 
hacer nada serio y...

Salud!

Jordi



Més informació sobre la llista de correu Barcelona-pm