La metaprogramación se refiere a una variedad de formas en que un programa tiene conocimiento de sí mismo o puede manipularse a sí mismo.
En lenguajes como C#, la reflexión es una forma de metaprogramación ya que el programa puede examinar información sobre sí mismo. Por ejemplo devolver una lista de todas las propiedades de un objeto.
En lenguajes como ActionScript, se pueden evaluar funciones en tiempo de ejecución para crear nuevos programas como eval(«x» + i). DoSomething() afectaría a un objeto llamado x1 cuando i es 1 y x2 cuando i es 2.
Por último, otra forma común de metaprogramación es cuando el programa puede cambiarse a sí mismo de forma no trivial. LISP es bien conocido por esto y es algo que Paul Graham defendió hace una década. Tendré que buscar algunos de sus ensayos específicos. Pero la idea es que el programa cambie otra parte del programa basado en su estado. Esto permite un nivel de flexibilidad para tomar decisiones en tiempo de ejecución que es muy difícil en la mayoría de los lenguajes populares hoy en día.
También vale la pena señalar que en los buenos tiempos de la programación en ensamblador directo, los programas que se alteraban a sí mismos en tiempo de ejecución eran necesarios y muy comunes.
Del ensayo de Paul Graham «What Made Lisp Different»:
Muchos lenguajes tienen algo llamado macro. Pero las macros de Lisp son únicas. Y aunque no lo crea, lo que hacen está relacionado con los paréntesis. Los diseñadores de Lisp no pusieron todos esos paréntesis en el lenguaje sólo para ser diferentes. Para el programador de Blub, el código Lisp parece raro. Pero esos paréntesis están ahí por una razón. Son la evidencia externa de una diferencia fundamental entre Lisp y otros lenguajes.
El código Lisp está hecho de objetos de datos Lisp. Y no en el sentido trivial de que los archivos fuente contienen caracteres, y las cadenas son uno de los tipos de datos soportados por el lenguaje. El código Lisp, después de ser leído por el analizador sintáctico, está hecho de estructuras de datos que puedes recorrer.
Si entiendes cómo funcionan los compiladores, lo que realmente ocurre no es tanto que Lisp tenga una sintaxis extraña como que Lisp no tiene sintaxis. Los programas se escriben en los árboles de análisis que se generan en el compilador cuando se analizan otros lenguajes. Pero estos árboles de análisis sintáctico son totalmente accesibles para sus programas. Puede escribir programas que los manipulen. En Lisp, estos programas se llaman macros. Son programas que escriben programas.
¿Programas que escriben programas? ¿Cuándo querrías hacer eso? No muy a menudo, si piensas en Cobol. Todo el tiempo, si piensas en Lisp. Sería conveniente aquí si pudiera dar un ejemplo de una macro poderosa, y decir ¡ahí! ¿qué tal eso? Pero si lo hiciera, sólo parecería un galimatías para alguien que no conociera Lisp; no hay espacio aquí para explicar todo lo que se necesita saber para entender lo que significa. En Ansi Common Lisp intenté avanzar lo más rápido posible, y aun así no llegué a las macros hasta la página 160.
Pero creo que puedo dar un tipo de argumento que puede ser convincente. El código fuente del editor Viaweb era probablemente un 20-25% de macros. Las macros son más difíciles de escribir que las funciones Lisp ordinarias, y se considera de mal estilo usarlas cuando no son necesarias. Así que cada macro en ese código está ahí porque tiene que estar. Esto significa que al menos el 20-25% del código de este programa está haciendo cosas que no se pueden hacer fácilmente en ningún otro lenguaje. Por muy escéptico que sea el programador de Blub respecto a mis afirmaciones sobre los misteriosos poderes de Lisp, esto debería despertar su curiosidad. No estábamos escribiendo este código para nuestra propia diversión. Éramos una pequeña empresa, programando tan duro como podíamos para poner barreras técnicas entre nosotros y nuestros competidores.
Una persona sospechosa podría empezar a preguntarse si había alguna correlación aquí. Una gran parte de nuestro código hacía cosas que son muy difíciles de hacer en otros lenguajes. El software resultante hacía cosas que el software de nuestros competidores no podía hacer. Tal vez había algún tipo de conexión. Te animo a seguir ese hilo. Puede que haya más de lo que parece en ese viejo que cojea con sus muletas.