Migração 3.x → 4.0
O que mudou, o que quebrou e como atualizar.
O que quebra#
`//` agora é comentário por padrão#
Esta é a única mudança que pode alterar o comportamento de código existente:
dataforge
x := a // b # 3.x: divisão inteira · 4.0: COMENTÁRIO
x := 7 // 2 # 3.x e 4.0: divisão (dígito depois)
x := total // len(xs) # 3.x e 4.0: divisão (chamada depois)A correção é mecânica: troque por ~/ onde você quer divisão. O dataforge fmt já reimprime nessa grafia.
Três palavras deixaram de ser reservadas#
cluster, vault e range viraram funções chamáveis. Isso libera nomes, não quebra nada.
Três palavras novas foram reservadas#
record, enum e when. Se você usava alguma como nome de variável, precisa renomear.
bash
dataforge check src/ # aponta todos os casosO que foi corrigido#
Comportamentos que estavam errados no 3.x e agora funcionam. Se seu código dependia do bug, ele muda:
| O que | Antes | Agora |
|---|---|---|
yield dentro de monitor | era engolido pelo handle | retorna da ação |
monitor sem handle | engolia o erro | deixa o erro subir |
2 ** 3 ** 2 | 64 | 512 — associa à direita |
-2 ** 2 | 4 | -4 |
f(1) com 2 params | ligava o resto a void | erro de aridade |
adopt X.Inexistente | devolvia vault vazio | ImportError_ |
str(obj) | ignorava toString | usa toString |
defer com erro | não rodava | roda em todo caminho |
| transações SQLite | rollback não desfazia | funciona |
O que é novo#
- Records e enums
- Pattern matching estrutural com guardas
- Interpolação
$"{x}" - Ternário,
??,?.,in/not in - Desestruturação, spread, compreensões
- Generators com
stream actioneemit - Análise estática e stack traces
- Imports seletivos e
relayfuncional - Sete módulos novos na biblioteca
- Seis ferramentas:
check,test,fmt,lint,doc,init
O roteiro de migração#
bash
# 1. rodar a análise estática — ela aponta quase tudo
dataforge check src/
# 2. formatar — normaliza ~/ e o resto
dataforge fmt src/
# 3. rodar os testes
dataforge test
# 4. rodar o linter, para o que sobrou
dataforge lint src/Na prática, a maioria dos projetos precisa apenas do passo 1 e de trocar alguns // por ~/.
Aproveitando o novo#
Nada obriga a reescrever. Mas alguns padrões ficam bem mais curtos:
dataforge
# antes
out "Ola, " + nome + "! Voce tem " + str(idade) + " anos."
# agora
out $"Ola, {nome}! Voce tem {idade} anos."
# antes
given config isnt void and config["porta"] isnt void:
porta := config["porta"]
otherwise:
porta := 8080
# agora
porta := config?.porta ?? 8080
# antes
resultado := []
cycle n in nums:
given n % 2 is 0:
resultado.append(n * n)
# agora
resultado := [n * n cycle n in nums given n % 2 is 0]