Episódio 14 - Funções com Parâmetros: tornando sua linguagem realmente expressiva
No episódio anterior, mostramos como criar macros reutilizáveis. Agora vamos dar um passo ainda mais expressivo: permitir funções com parâmetros, como em qualquer linguagem real.
Por que isso é importante?
Porque reutilizar blocos é bom, mas reutilizar blocos que se adaptam ao contexto é muito melhor.
Vamos direto ao ponto.
Sintaxe desejada
Queremos que o JSON do interpretador aceite algo assim:
{
"acao": "DefinirFuncao",
"nome": "VerificarMaioridade",
"parametros": ["idade"],
"blocos": [
{ "se": { ">=": [ { "var": "idade" }, 18 ] }, "entao": { "retornar": true } },
{ "senao": { "retornar": false } }
]
}
Depois, poderemos usar assim:
{
"acao": "ChamarFuncao",
"nome": "VerificarMaioridade",
"parametros": { "idade": 21 }
}
Como funciona internamente
- O interpretador registra a função com nome, lista de parâmetros e blocos
- Quando a função é chamada, cria-se um contexto local onde os parâmetros viram variáveis
- Os blocos da função são executados com esse contexto temporário
- O valor de
retornarquebra a execução e entrega o resultado
Benefícios imensos
- Você pode escrever menos e reaproveitar mais
- Pode construir sua própria biblioteca declarativa
- Pode escrever sistemas de regras com clareza e baixo acoplamento
- Pode adicionar testes automáticos para cada função declarativa
E mais: isso se encaixa perfeitamente com TSafeThreadInterface e TTaskChain
Imagine usar esse mesmo sistema para criar workflows declarativos:
- Uma função que representa uma tarefa
- Que pode ser chamada com parâmetros diferentes
- E executada em thread separada
- E encadeada com outras
Você acaba de criar sua linguagem declarativa pluginável, paralelizável e reutilizável.
No próximo episódio, vamos mostrar como usar essas funções para criar pipelines de execução complexos, onde o resultado de uma chamada alimenta outra. Literalmente, um motor de execução declarativo com fluxo de dados.