[Madrid-pm] El tiempo irresistible de volver
Salvador Fandino
sfandino en yahoo.com
Lun Sep 27 06:55:59 PDT 2010
>
> Una forma sería... no teniendo subrutinas... :)
>
> Es decir... lo mismo que se hace con las funciones inline en C
><http://www.greenend.org.uk/rjk/2003/03/inline.html>
>
> En Perl, sí que hay una manera de indicar que queremos que una función sea
>'inline', usando prototipos. Pero no podremos hacer con todas las funciones...
>
> http://perldoc.perl.org/perlsub.html#Constant-Functions
>
> Functions with a prototype of () are potential candidates for inlining. If the
>result after optimization and constant folding is either a constant or a
>lexically-scoped scalar which has no other references, then it will be used in
>place of function calls made without & . Calls made using & are never inlined.
>(See constant.pm for an easy way to declare most constants.)
En realidad esto de las funciones con prototipo () que se expanden en linea no
es mas que un "hack" para definir constantes... más alla de eso, no creo que
nadie sea capaz de encontrarle alguna utilidad.
> O a mano...
>
> Tendrías que hacer que el código tuviese un constructor de código, que
>sustituyera cada aparición de la subrutina en el flujo principal del programa,
>por el código de la propia subrutina, y luego, hacer un eval() del código
>generado.
>
> En buena parte de los casos, sería suficiente con meter el código dentro de un
>nuevo contexto ({ }), y añadiendo al principio una forma de asignar los
>argumentos que queramos pasar a la subrutina.
Con el soporte para plugable-keywords en 5.12 se podría crear un nuevo token
para expandir funciones. Algo asi como...
sub foo { ... }
$bar = inline_sub foo(@args);
... pero no creo que sea facil ;-)
- Salva
Más información sobre la lista de distribución Madrid-pm