Pular para o conteúdo

Metaprogramação: o mapa

Item por item da parte 5 da referência Deep Tech — comptime, macros, DSLs e compiler plugins — cruzado com o que o DataForge tem.

A quinta parte de uma referência Deep Tech cobre computação em tempo de compilação, macros, DSLs e plugins do compilador. Boa parte dela pressupõe um compilador com fases separadas. Aqui a "compilação" é parse + check + carga — e é nessas três que as peças abaixo se encaixam.

22 · Computação em tempo de compilação#

ItemNo DataForgeOnde
comptimeexiste: roda na carga, numa caixa sem E/S, e congela o resultadocomptime
const evaluationcomptime steady NOME := … — constante calculadacomptime
funções executadas no buildações declaradas dentro do bloco comptimecomptime
geração de constantes, lookup tableso caso central: a tabela é calculada uma vezcomptime
validações estáticasassert dentro de comptime; o check acusa (comptime-falhou)comptime
cálculos matemáticos em compile-timesim — é conta pura, que é o que a caixa permitecomptime
especialização de códigonão existe em build: o caminho é overload (decide na chamada) e a macro (reescreve o corpo)Sobrecarga
geração de tiposparcial: alias genérico (type Par<T> := …) e argumento numérico (Vetor<3>)Generics

23 · Macros#

ItemNo DataForgeOnde
macros proceduraisArcane.Macro: a árvore como dado, transformada por código comumMacros
AST manipulation e transformationarvore, percorrer, transformar, substituir, reescreverMacros
expansão de macrosacontece na carga, quando o decorador é aplicadoMacros
macros de atributomark @M.derivar(…) sobre um blueprintMacros
macros derivadastexto, igualdade, ordem, vault a partir dos camposMacros
higiene de macrosexplícita: nome_fresco e renomear — automática exigiria saber o que é "de dentro"Macros
macros declarativas (padrão → substituição)não existem como forma própria: o mesmo se escreve com transformar e um given
token streamsnão se expõem: a macro trabalha sobre a árvore, que é o nível em que o significado já está resolvido

24 · DSLs#

ItemNo DataForgeOnde
DSLs internasblueprint com operadores, pipeline >>, ação de alta ordem — e as palavras contextuais do Kiln e do QuadroKiln
DSLs externasArcane.Dsl: combinadores de análise, com falha que diz a posiçãoDSLs
parser extensionsnão existem como plugin: palavra nova na linguagem é mexer no parser — foi assim com as onze do Kiln e os seis verbos do Quadro
AST híbridaa árvore de M.citar e a do arquivo são a mesma, e é isso que deixa gerar código que rodaMacros
geração de código, templatesM.compilar(texto, …) e M.acao(…); para texto puro, $"{}" e Arcane.TextMacros

25 · Compiler plugins#

ItemNo DataForgeOnde
plugins do compiladorplugins do check: um .df com verificar(arvore, arquivo)Plugins
custom lintsé exatamente o caso de uso, com código próprio e silenciamentoPlugins
analisadores estáticosa árvore inteira é entregue; o que o plugin prova, ele acusaPlugins
hooksum hook só: verificar. Mais hooks sem caso de uso viram superfície para manterPlugins
análise de fluxopossível dentro do plugin (a ordem das instruções está na árvore); o que não existe é um grafo de fluxo pronto
transformações de AST no compiladornão existem por plugin: transformar é trabalho de macro, na carga do arquivo — um plugin do check que reescrevesse código faria check e run discordarem
verificação formalnão existe: o refinamento é verificado, não provadoTipos nomeados

O resumo honesto#

Das quatro seções, três têm resposta direta: comptime, macros sobre a árvore e plugins do check. A quarta — DSLs — tem duas respostas: a interna, que sempre existiu, e a externa, agora com combinadores.

O que não existe tem um padrão: tudo o que exige mexer no parser em tempo de execução (parser extensions, token streams, macros declarativas com sintaxe nova). Isso é decisão de linguagem, e as vezes em que valeu a pena — as onze palavras do Kiln, os seis verbos do Quadro, as treze de OOP — foram feitas no parser, com o custo explicado em cada uma.