[bcn-pm] programilla Perl, inutil pero divertido

Jordi Delgado jdelgado a lsi.upc.edu
dim jul 14 08:34:46 PDT 2009


Buenas,

Algunos os acordareis de aquel programilla en Lisp que os mostre en una reunion de mongers, que hacia memoizing auto-modificando su propio codigo. Bien, creo que esto no es posible en Perl, ya que se compila a bytecode y luego se interpreta (por cierto, si me equivoco y alguien sabe de una subrutina que, dado un nombre, retorne una string con el codigo fuente de la subrutina con ese nombre que lo diga; que yo sepa no existe).

Sea como sea, aqui va un programilla bastante tontito que hace algo parecido a lo que hacia aquel programa Lisp (ya se que con un array se resuelve mejor el problema, que conste). Completamente inutil, bastante sencillo (estoy intentando llegar al nivel Alpaca antes del YAPC de Lisboa), pero... entretenido.


## Esta funcion 'costly' no sirve para nada, solo es la supuesta funcion que
## cuesta mucho de calcular, y que no queremos calcular mas de una vez para
## cada valor del parametro.

sub costly {
  print "This computation takes a lot of time with parameter $_[0]...\n";
  return $_[0] + 1;
}


## 'memoize_funny' retorna una closure donde la variable $code_string contiene
## el codigo que se va a modificar y que se va a ejecutar mediante 'eval'. El
## valor inicial sirve para detectar la presencia de un valor nuevo, al que
## todavia no hemos aplicado nunca la funcion 'costly'.

sub memoize_funny {
  my $code_string = 'if (1) { \'dummy\' };';
  return sub {
    my $param = shift;
    my $result = eval $code_string;
    if ($result eq 'dummy') {
      $result = &costly($param);
      $code_string = "if (\$param == $param) { $result } els$code_string";
    } else {
      print "No costly call! Result: $result\n";
    }
  }
}


## Esto solo sirve para probar lo anterior

my $computing_function = &memoize_funny();
while (<STDIN>) {
  chomp;
  &$computing_function($_);
}


Bueno, es para animar la lista, y si se os ocurre alguna manera mas bizarra de hacer lo mismo...

Ya se que no es muy complicado, pero se hace lo que se puede... ;-)

Salud!

Jordi




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