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:
action f():
yield 1 # devolve 1 e ENCERRA
stream action g():
emit 1 # produz 1 e CONTINUA
emit 2`//` virou comentário sem querer#
x := a // b # isto é COMENTÁRIO — x fica sem valor
x := a ~/ b # isto é divisão inteiraRegra: // 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#
no := 1 # ERRO: 'no' é o literal falso
nao := 1 # certoAs 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#
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#
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#
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#
sql := """SELECT nome, preco
FROM produtos
WHERE preco > ?"""Para SQL ou texto multilinha, use as aspas triplas.
Generator infinito com `to_cluster()`#
naturais().to_cluster() # TRAVA — sequência infinita
naturais().take(10) # certoDuas 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#
# 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