E se você pudesse inventar sua própria linguagem?
\n\nImagine: você escreve código que é lido como texto em inglês comum. Sem parênteses extras, sem for e if, apenas instruções claras e compreensíveis. Parece fantasia? Pois não é. Isso é DSL (Domain-Specific Language) — uma linguagem específica de domínio, criada para uma tarefa específica.
No PythonLib, falamos frequentemente sobre como tornar o código mais limpo e expressivo. Hoje vamos abordar de um ângulo inesperado: pegaremos o JavaScript e o transformaremos em uma ferramenta para criar suas próprias mini-linguagens. Por quê? Para que suas configurações deixem de ser uma "bagunça" e a lógica de negócios soe como música.
\n\nPronto para se tornar um linguista no mundo da programação? Vamos nessa!
\n\nDSL: o que é e para que serve?
\n\nDSL (linguagem específica de domínio) é uma linguagem de programação (ou extensão sintática dela) criada para resolver problemas de uma área específica. Ao contrário das linguagens de uso geral (C++, Python, Java), a DSL não tenta abranger tudo. Sua função é ser o mais expressiva possível em seu nicho.
\n\nExemplos da vida real:
\n- \n
- SQL — linguagem para trabalhar com bancos de dados. \n
- HTML — linguagem de marcação de páginas web. \n
- Regex — linguagem para busca por padrão. \n
- Makefile — linguagem para descrever a construção de projetos. \n
Agora imagine que você pode criar uma linguagem igualmente conveniente para sua tarefa: para descrever regras de negócio, para configurar bots, para construir consultas complexas a APIs. Criar DSL em JavaScript é um superpoder que torna o código autodocumentado e reduz a barreira de entrada para novos desenvolvedores.
\n\nDSL internos e externos: dois caminhos para o mesmo objetivo
\n\nDSL interno (Embedded DSL)
\nÉ uma camada sobre uma linguagem existente. Você usa a sintaxe do JavaScript, mas constrói "blocos" de uma nova linguagem. O exemplo mais popular é a Fluent API (encadeamento de métodos).
\n\nVantagens: não precisa escrever um parser, usa todos os recursos da linguagem hospedeira (depuração, tipos, ferramentas).
\nDesvantagens: limitado pela sintaxe do JavaScript (sem novos operadores).
DSL externo
\nVocê inventa sua própria sintaxe do zero e depois escreve um parser (ou compilador) que a transforma em JavaScript.
\n\nVantagens: liberdade total de sintaxe, é possível criar uma linguagem muito concisa.
\nDesvantagens: precisa escrever e manter o parser, mais difícil de depurar.
Para a maioria dos projetos, DSL em JavaScript começa com a abordagem interna — é mais simples e pode ser implementada ainda hoje.
\n\nEscrevendo nossa primeira DSL: da configuração à poesia
\n\nVamos criar um DSL interno para descrever rotas em uma aplicação web. Em vez de escrever:
\n\nconst routes = [\n { path: '/users', handler: usersHandler, method: 'GET' },\n { path: '/users/:id', handler: userById, method: 'GET' },\n { path: '/users', handler: createUser, method: 'POST' }\n];\n\nQueremos escrever assim:
\n\nconst router = new Router();\nrouter\n .get('/users', usersHandler)\n .get('/users/:id', userById)\n .post('/users', createUser);\n\nJá está melhor, certo? Mas isso é só o começo. Um DSL de verdade deve ser ainda mais expressivo.
\n\nPasso 1: Fluent API (Encadeamento de métodos)
\n\nA maneira mais simples de criar uma linguagem específica de domínio é retornar this de cada método.
class Router {\n constructor() {\n this.routes = [];\n }\n\n get(path, handler) {\n this.routes.push({ path, handler, method: 'GET' });\n return this; // chave para o encadeamento\n }\n\n post(path, handler) {\n this.route