Introdução
DataForge é uma linguagem de programação interpretada, de propósito geral, implementada em Python 3.10+ sem dependências externas no runtime.
O que é#
DataForge não é um DSL nem um transpilador. Tem lexer, parser recursivo descendente, AST tipada, analisador estático e interpretador de árvore próprios — cerca de 19 mil linhas de Python, sem uma única dependência externa em tempo de execução.
O que a distingue não é a lista de recursos, e sim o vocabulário. Onde outras linguagens dizem if, for, class e try, o DataForge diz given, cycle, blueprint e monitor. As palavras foram escolhidas para descrever a intenção de quem escreve, não a mecânica da máquina.
| Valor | |
|---|---|
| Versão | 1.0.0 |
| Extensão | .df |
| Runtime | Python 3.10+, zero dependências |
| Biblioteca padrão | 34 módulos, 1132 símbolos |
| Funções globais | 228, sem adopt |
| Licença | MIT |
Um exemplo completo#
Este programa usa record, enum, pattern matching com guarda, pipeline, compreensão de lista e interpolação de strings — tudo o que a linguagem tem de mais característico, em trinta linhas:
adopt Arcane.Collections as Col
record Produto:
nome: String
preco: Number
estoque: Integer
enum Situacao:
EmFalta
Critico
Normal
action situacao_de(p: Produto) -> Situacao:
match p:
point Produto(estoque := 0):
yield Situacao.EmFalta
point Produto(estoque := e) when e smaller 5:
yield Situacao.Critico
default:
yield Situacao.Normal
estoque := [
Produto("Mouse", 80.0, 15),
Produto("Teclado", 200.0, 3),
Produto("Monitor", 1200.0, 0)
]
patrimonio := estoque
>> morph p: p.preco * p.estoque
>> distill acc, v: acc + v 0
cycle p in Col.sort_by_field(estoque, "preco", yes):
out $"{p.nome.pad_end(10)} {situacao_de(p).name.pad_end(10)} R$ {p.preco * p.estoque}"
out $"\npatrimônio: R$ {patrimonio}"
out $"repor: {[p.nome cycle p in estoque given situacao_de(p) isnt Situacao.Normal]}"A saída:
Monitor EmFalta R$ 0.0
Teclado Critico R$ 600.0
Mouse Normal R$ 1200.0
patrimônio: R$ 1800.0
repor: [Teclado, Monitor]Filosofia#
Vocabulário que descreve intenção#
monitor / handle / ensure diz exatamente o que o bloco faz: monitorar, tratar, garantir. Comparado a try / catch / finally, que descreve a mecânica do runtime, o primeiro comunica a intenção do programador.
Erros que ensinam#
Uma mensagem de erro deve dizer o que fazer, não apenas o que houve. Compare:
RuntimeError: Invalid assignment target
'no' is a reserved keyword and cannot be assigned to.
sugestão: Pick another name.Análise otimista#
O analisador estático fica calado quando não consegue provar que algo está errado. Um falso alarme é pior que um alerta perdido, porque ensina a ignorar as mensagens. Hoje ele reporta zero erros em 233 arquivos conhecidamente bons.
Verificável#
Cada afirmação desta documentação corresponde a código que roda. São 1246 testes, 216 exercícios que verificam o próprio resultado com assert, e 43 programas de exemplo. Os trechos desta documentação são compilados a cada mudança — 568 deles.
De onde você vem#
Se você já programa, esta tabela é a ponte mais rápida:
| Conceito | Outras linguagens | DataForge |
|---|---|---|
| atribuição | x = 1 | x := 1 |
| constante | const | steady |
| imprimir | print | out |
| interpolação | f"{x}" | $"{x}" |
| condicional | if/elif/else | given/orif/otherwise |
| seleção | switch/match | match/point/when |
| laço | for/while | cycle/persist |
| função | def/return | action/yield |
| gerador | yield | stream action/emit |
| classe | class/new | blueprint/spawn |
| dados imutáveis | @dataclass(frozen) | record |
| interface | interface | trait |
| módulos | import/export | adopt/relay |
| erros | try/catch/finally | monitor/handle/ensure |
| booleanos | true/false/null | yes/no/void |
| coleções | filter/map/reduce | >> sift/morph/distill |
| divisão inteira | // | ~/ |
Instalação#
git clone https://github.com/estevam5s/DataForge.git
cd DataForge
python3 -m venv .venv && source .venv/bin/activate
pip install .
dataforge versionDepois disso, seu primeiro programa leva mais um minuto. O guia completo, com Windows e solução de problemas, está em Instalação.
O que tem hoje#
| Área | Recursos |
|---|---|
| Tipos | anotações opcionais verificadas, typeof, cast, análise estática |
| Dados | records imutáveis, enums, clusters, vaults, compreensões |
| Fluxo | given/orif/otherwise, match estrutural, quatro laços |
| Ações | padrões, tipos, closures, lambdas, decoradores, defer |
| Erros | handle tipado, guard, retry, propagate, stack traces |
| Fluxos | pipelines, stream action com avaliação preguiçosa |
| Módulos | adopt seletivo, relay, detecção de ciclos, forge.toml |
| Ferramentas | 40 comandos: check, test, fmt, lint, big-o, debug, lsp, repl |
| Editor | servidor de linguagem: autocompletar, hover, ir-para-definição, renomear |
| Web | Kiln — rotas, middleware, CSRF, cache, gzip, idempotência |
| Testes | Crucible — 59 matchers, fixtures, dublês, benchmark |
| Banco | Forge — SQLite, Postgres, MySQL, Redis e Mongo por protocolo próprio |
| Dados | Parquet, Data Lake, pipelines, streaming, ML |
| Pacotes | semver, lockfile, verificação de integridade, registro estático |
O que ainda não tem#
Ser honesto sobre isto é parte de conhecer a ferramenta:
- Desempenho — é interpretador de árvore escrito em Python, e paga duas camadas de interpretação. Medido:
fib(28)em 4,8 s contra 0,02 s do CPython. Não é bloqueio para script, ETL, CLI ou servidor, onde a rede domina; é bloqueio para laço quente. Uma VM de bytecode é o próximo salto. - Generics com restrição —
<T>existe e o analisador o aceita, mas não há<T extends Comparable>: o parâmetro documenta a relação entre entrada e saída, e não é verificado em execução. - Exaustividade além de enum — o
matchavisa quando um membro de enum fica de fora, mas não confere sequências nem records. - Depurador gráfico —
dataforge debugexiste e para, anda e inspeciona no terminal, mas ainda não fala o protocolo que poria os controles na barra do editor. - Ecossistema — o registro tem 20 pacotes, todos deste projeto. Uma linguagem fica completa quando outra pessoa publica nela, e isso não se resolve com código.
O que deixou de faltar desde a última revisão: LSP, depurador, exaustividade de enum, contrato de trait e o gerenciador de pacotes — todos existem hoje.
O plano completo está no Roadmap.
Por onde começar#
Primeiros passos
5 minInstale, escreva o primeiro programa e conheça a CLI.
Visão geral
13 páginasA linguagem do zero, na ordem em que é usada.
216 exercícios
26 módulosCada um se verifica com assert. Dezesseis módulos têm um .md explicativo ao lado de cada exercício.
Biblioteca Arcane
1132 símbolosEstatística, bancos, HTTP, criptografia, Parquet, ML, streaming.
Referência formal
Gramática EBNF, palavras reservadas, precedência e semântica.
Receitas
Projetos completos: CLI, API REST, ETL, interpretador.