[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