viernes, 6 de julio de 2012

Que es la metaprogramación?


La metaprogramación consiste en escribir programas que escriben o manipulan otros programas (o a sí mismos) como datos, o que hacen en tiempo de compilación parte del trabajo que, de otra forma, se haría en tiempo de ejecución. Esto permite al programador ahorrar tiempo en la producción de código. Son programas que escriben programas, me suena a apocalíptico, como la skynet creando robots.

La metaprogramación no es una nueva idea - Nació hace ya más de 40 años, con el lenguaje Lisp, y se popularizó tremendamente en el lenguaje Smalltalk, a principios de los 80.

Como pueden imaginar un lenguaje script o dinamicos, facilita el uso de metaprogramación dado que no tiene que compilar o compilarse, simplemente modifica código y lo va corriendo.


Veamos como crearíamos una clase en Ruby: 



def crea_clase(nombre, clase_padre)
         eval "class #{nombre} < #{clase_padre} ; end"
end

De esta forma podemos hacer lo siguiente:

['Empleado', 'Cliente', 'Otro'].each  do |nombre_de_la_clase|
        crea_clase( nombre_de_la_clase , 'Persona')
end

Y así creamos clases a lo pavote, con 6 lineas de código.

En javascript tenemos el eval que podemos utilizar para correr scripts. Esto esta bueno para hacer ajax de código javascript, por poner ejemplo si el usuario eligió un parametro se muestra el valor del parámetro en un alert o un confirm.


$.get('ajax/test.php', function(dataJavascript) {
    eval (dataJavascript);
});


y en php en la url ajax/test.php tenemos: 


<?php
if (parametro) {
  echo " alert(".parametro."); " ;
}
else {
  echo " confirm(".parametro."); " ;
}
?>

Si podria haber puesto un if en  la función ajax pero era un ejemplo. Existen variados usos para a metaprogramación que nos resuelven problemas de forma elegante.