Cópia estática
Copiado de docs/guides/errors-null-void.pt-BR.md em https://github.com/poppy-team/ori-lang (MIT). Fixado na revisão 42e1817227fbc96e8e4a4a85fac78b3fec0a0e0f, blob 6eb0e01507a8b7faa312428716b07218cb25abb4. O repositório de origem permanece canônico; esta cópia é atualizada por um pull request de sincronização, não em tempo real.
Guia pedagógico (S3 + inferência B / workspace 0.3.8-dev). English: errors-null-void.md
Normativo: 09-errors, 04-types
| Conceito | Papel | Quando |
|---|---|---|
void | Sem valor útil de retorno | Funções de efeito |
optional[T] | Valor pode faltar | Busca, EOF — ausência ≠ falha |
result[T, E] | Sucesso ou falha com motivo | I/O, validação |
check | Pré-condição em runtime | Invariantes |
Ori não tem null. Use none ou err(...).
void module app.main
import ori.io as io
greet() -> void
io.println("olá")
end
main()
greet()
endoptional[T] module app.main
find_user(id: int) -> optional[string]
if id == 0
return none
end
return some("alice")
end
main()
match find_user(1)
case some(name):
-- use name
case none:
end
endif some(x) = expr ou match.try em optional propaga none.? foi removido no S3.result[T, E] module app.main
import ori.fs as fs
import ori.io as io
read_config(path: string) -> result[string, string]
return fs.read_text(path)
end
main()
match read_config("app.conf")
case ok(text):
io.println(text)
case err(msg):
io.eprintln(msg)
end
endok / err (não success / error).match ou try expr.check module app.main
divide(a: int, b: int) -> int
check b != 0, "division by zero"
return a / b
endQuebra o processo se o contrato falhar; não é um result.
| Situação | Use |
|---|---|
| Só efeito | -> void |
| “Não achou”, sem erro | optional[T] |
| Falha com mensagem | result[T, string] |
| Sempre deve ser verdade | check |
ori explain name.undefined
ori doctorCatálogo: 13-error-catalog.md.