Metaprogramação refere-se a uma variedade de formas como um programa tem conhecimento de si mesmo ou pode se manipular.
Em linguagens como C#, a reflexão é uma forma de metaprogramação uma vez que o programa pode examinar informações sobre si mesmo. Por exemplo, retornando uma lista de todas as propriedades de um objeto.
Em linguagens como ActionScript, você pode avaliar funções em tempo de execução para criar novos programas tais como eval(“x” + i). DoSomething() afetaria um objeto chamado x1 quando i é 1 e x2 quando i é 2.
Finalmente, outra forma comum de metaprogramação é quando o programa pode mudar a si mesmo em modas não triviais. O LISP é bem conhecido por isso e é algo que Paul Graham defendeu há cerca de uma década. Vou ter que procurar alguns dos seus ensaios específicos. Mas a ideia é que o programa mudaria outra parte do programa com base no seu estado. Isto permite um nível de flexibilidade para tomar decisões em tempo de execução que é muito difícil na maioria das linguagens populares de hoje.
É também digno de nota que nos bons velhos tempos da programação em montagem reta, programas que se alteravam em tempo de execução eram necessários e muito comuns.
Do ensaio de Paul Graham “What Made Lisp Different”:
Muitas linguagens têm algo chamado macro. Mas as macros de Lisp são únicas. E acredite ou não, o que elas fazem está relacionado com os parênteses. Os designers de Lisp não colocaram todos esses parênteses na linguagem só para serem diferentes. Para o programador do Blub, o código Lisp parece estranho. Mas esses parênteses estão lá por uma razão. Eles são a evidência externa de uma diferença fundamental entre Lisp e outras linguagens.
O código Lisp é feito a partir de objetos de dados Lisp. E não no sentido trivial de que os arquivos fonte contêm caracteres, e strings são um dos tipos de dados suportados pela linguagem. O código Lisp, depois de lido pelo analisador, é feito de estruturas de dados que você pode atravessar.
Se você entender como os compiladores funcionam, o que realmente está acontecendo não é tanto que o Lisp tem uma sintaxe estranha, mas que o Lisp não tem sintaxe. Você escreve programas nas árvores parse que são gerados dentro do compilador quando outras linguagens são parsed. Mas estas árvores parse são totalmente acessíveis aos seus programas. Você pode escrever programas que os manipulam. Em Lisp, estes programas são chamados de macros. Eles são programas que escrevem programas.
Programas que escrevem programas? Quando você gostaria de fazer isso? Não muito frequentemente, se você pensar em Cobol. O tempo todo, se você pensar em Lisp. Seria conveniente aqui, se eu pudesse dar um exemplo de uma macro poderosa, e dizer lá! que tal isso? Mas se o fizesse, pareceria apenas uma algaraviada para alguém que não conhecia Lisp; não há espaço aqui para explicar tudo o que você precisaria saber para entender o significado. No Ansi Common Lisp eu tentei mover as coisas o mais rápido que pude, e mesmo assim não cheguei a macros até a página 160.
Mas acho que posso dar um tipo de argumento que pode ser convincente. O código fonte do editor do Viaweb era provavelmente cerca de 20-25% de macros. Macros são mais difíceis de escrever que funções Lisp comuns, e é considerado um mau estilo usá-las quando não são necessárias. Portanto, cada macro nesse código está lá porque tem que estar. O que isso significa é que pelo menos 20-25% do código neste programa está fazendo coisas que você não pode fazer facilmente em qualquer outra linguagem. Por mais céptico que o programador Blub possa ser em relação às minhas reivindicações pelos poderes misteriosos de Lisp, isto deve deixá-lo curioso. Nós não estávamos a escrever este código para nossa própria diversão. Éramos uma pequena inicialização, programando o mais difícil que podíamos para colocar barreiras técnicas entre nós e nossos concorrentes.
Uma pessoa suspeita poderia começar a se perguntar se havia alguma correlação aqui. Um grande pedaço do nosso código estava fazendo coisas que são muito difíceis de fazer em outras linguagens. O software resultante fez coisas que os softwares dos nossos concorrentes não conseguiam fazer. Talvez houvesse algum tipo de ligação. Eu encorajo-o a seguir essa linha. Pode haver mais do que aquele velho coxeando em suas muletas do que o olho.