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#
| Item | No DataForge | Onde |
|---|---|---|
comptime | existe: roda na carga, numa caixa sem E/S, e congela o resultado | comptime |
| const evaluation | comptime steady NOME := … — constante calculada | comptime |
| funções executadas no build | ações declaradas dentro do bloco comptime | comptime |
| geração de constantes, lookup tables | o caso central: a tabela é calculada uma vez | comptime |
| validações estáticas | assert dentro de comptime; o check acusa (comptime-falhou) | comptime |
| cálculos matemáticos em compile-time | sim — é conta pura, que é o que a caixa permite | comptime |
| especialização de código | não existe em build: o caminho é overload (decide na chamada) e a macro (reescreve o corpo) | Sobrecarga |
| geração de tipos | parcial: alias genérico (type Par<T> := …) e argumento numérico (Vetor<3>) | Generics |
23 · Macros#
| Item | No DataForge | Onde |
|---|---|---|
| macros procedurais | Arcane.Macro: a árvore como dado, transformada por código comum | Macros |
| AST manipulation e transformation | arvore, percorrer, transformar, substituir, reescrever | Macros |
| expansão de macros | acontece na carga, quando o decorador é aplicado | Macros |
| macros de atributo | mark @M.derivar(…) sobre um blueprint | Macros |
| macros derivadas | texto, igualdade, ordem, vault a partir dos campos | Macros |
| higiene de macros | explí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 streams | não se expõem: a macro trabalha sobre a árvore, que é o nível em que o significado já está resolvido | — |
24 · DSLs#
| Item | No DataForge | Onde |
|---|---|---|
| DSLs internas | blueprint com operadores, pipeline >>, ação de alta ordem — e as palavras contextuais do Kiln e do Quadro | Kiln |
| DSLs externas | Arcane.Dsl: combinadores de análise, com falha que diz a posição | DSLs |
| parser extensions | nã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íbrida | a árvore de M.citar e a do arquivo são a mesma, e é isso que deixa gerar código que roda | Macros |
| geração de código, templates | M.compilar(texto, …) e M.acao(…); para texto puro, $"{}" e Arcane.Text | Macros |
25 · Compiler plugins#
| Item | No DataForge | Onde |
|---|---|---|
| plugins do compilador | plugins do check: um .df com verificar(arvore, arquivo) | Plugins |
| custom lints | é exatamente o caso de uso, com código próprio e silenciamento | Plugins |
| analisadores estáticos | a árvore inteira é entregue; o que o plugin prova, ele acusa | Plugins |
| hooks | um hook só: verificar. Mais hooks sem caso de uso viram superfície para manter | Plugins |
| análise de fluxo | possí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 compilador | nã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 formal | não existe: o refinamento é verificado, não provado | Tipos 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.