Pular para o conteúdo

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ão1.0.0
Extensão.df
RuntimePython 3.10+, zero dependências
Biblioteca padrão34 módulos, 1132 símbolos
Funções globais228, sem adopt
LicençaMIT

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:

estoque.df
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:

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:

antes / depois
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:

ConceitoOutras linguagensDataForge
atribuiçãox = 1x := 1
constanteconststeady
imprimirprintout
interpolaçãof"{x}"$"{x}"
condicionalif/elif/elsegiven/orif/otherwise
seleçãoswitch/matchmatch/point/when
laçofor/whilecycle/persist
funçãodef/returnaction/yield
geradoryieldstream action/emit
classeclass/newblueprint/spawn
dados imutáveis@dataclass(frozen)record
interfaceinterfacetrait
módulosimport/exportadopt/relay
errostry/catch/finallymonitor/handle/ensure
booleanostrue/false/nullyes/no/void
coleçõesfilter/map/reduce>> sift/morph/distill
divisão inteira//~/

Instalação#

bash
git clone https://github.com/estevam5s/DataForge.git
cd DataForge

python3 -m venv .venv && source .venv/bin/activate
pip install .

dataforge version

Depois 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#

ÁreaRecursos
Tiposanotações opcionais verificadas, typeof, cast, análise estática
Dadosrecords imutáveis, enums, clusters, vaults, compreensões
Fluxogiven/orif/otherwise, match estrutural, quatro laços
Açõespadrões, tipos, closures, lambdas, decoradores, defer
Erroshandle tipado, guard, retry, propagate, stack traces
Fluxospipelines, stream action com avaliação preguiçosa
Módulosadopt seletivo, relay, detecção de ciclos, forge.toml
Ferramentas40 comandos: check, test, fmt, lint, big-o, debug, lsp, repl
Editorservidor de linguagem: autocompletar, hover, ir-para-definição, renomear
WebKiln — rotas, middleware, CSRF, cache, gzip, idempotência
TestesCrucible — 59 matchers, fixtures, dublês, benchmark
BancoForge — SQLite, Postgres, MySQL, Redis e Mongo por protocolo próprio
DadosParquet, Data Lake, pipelines, streaming, ML
Pacotessemver, 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 match avisa quando um membro de enum fica de fora, mas não confere sequências nem records.
  • Depurador gráficodataforge debug existe 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#