Pular para o conteúdo

Erros comuns

As armadilhas que mais custam tempo, e como sair delas.

`yield` retorna, não gera#

yield encerra a ação imediatamente. Para produzir uma sequência, use stream action com emit:

dataforge
action f():
    yield 1        # devolve 1 e ENCERRA

stream action g():
    emit 1         # produz 1 e CONTINUA
    emit 2

`//` virou comentário sem querer#

dataforge
x := a // b        # isto é COMENTÁRIO — x fica sem valor
x := a ~/ b        # isto é divisão inteira

Regra: // só é divisão quando seguido de dígito, (, ou identificador que abre chamada/índice/membro. Use `~/`.

`SyncError: Tab character detected`#

DataForge exige espaços, nunca tabs. No VS Code: paleta de comandos → "Convert Indentation to Spaces".

`SyncError: Indentation mismatch`#

Um bloco tem recuo inconsistente — 3 espaços onde os outros usam 4, por exemplo. Use sempre 4 por nível, ou rode dataforge fmt.

Palavra reservada como nome#

dataforge
no := 1        # ERRO: 'no' é o literal falso
nao := 1       # certo

As que mais pegam em português: no, in, is, to, from, as, step, point, default, frame, stream, emit, forge. A lista completa tem 81.

Esqueci o `self` num método#

dataforge
blueprint Conta(saldo):
    action depositar(valor):
        saldo := saldo + valor          # ERRADO: mexe no escopo externo
        self.saldo := self.saldo + valor # certo

`monitor` sem `handle` não engole o erro#

Isso é intencional. Um monitor: seguido só de ensure: garante a limpeza mas deixa o erro subir. Se você quer silenciar, escreva o handle explicitamente.

Padrão de sequência não casa com vault#

dataforge
match {"k": 1}:
    point [a]:          # NÃO casa — vault não é sequência
        yield "lista"
    point {"k": x}:     # casa
        yield "vault"

A ordem dos `point` importa#

dataforge
match n:
    point x:            # captura tudo
        yield "pegou tudo"
    point 5:            # INALCANÇÁVEL
        yield "nunca chega aqui"

Ordene do específico ao geral. Uma captura no topo engole todos os casos abaixo — e nenhum erro aparece, só o comportamento errado.

String simples não cruza linhas#

dataforge
sql := """SELECT nome, preco
FROM produtos
WHERE preco > ?"""

Para SQL ou texto multilinha, use as aspas triplas.

Generator infinito com `to_cluster()`#

dataforge
naturais().to_cluster()     # TRAVA — sequência infinita
naturais().take(10)         # certo

Duas threads escrevendo na mesma variável#

Perde atualizações silenciosamente. DataForge 4.0 não tem mutex — use `channel`, onde cada thread reporta o próprio resultado.

`cast` antes de validar#

dataforge
# errado: dispara se não for número
idade := cast entrada as Integer

# certo
given not entrada.isdigit():
    yield {"erro": "idade nao numerica"}
idade := cast entrada as Integer