Relay — o que sai do módulo
Declarar o que é público muda o que o analisador consegue provar sobre quem usa o módulo.
Sem relay, tudo que o arquivo declara no topo é visível de fora. Com relay, só o que está listado — e essa escolha tem uma consequência que quase ninguém espera.
dataforge
// biblioteca.df
action _normalizar(texto):
yield texto.strip().lower()
action buscar(termo):
yield $"procurando '{_normalizar(termo)}'"
record Resultado:
titulo: String
peso: Integer
// So estes dois saem. '_normalizar' fica dentro.
relay buscar, Resultado
out buscar(" Café ")
assert Resultado("x", 1).peso is 1O que o `relay` muda no analisador#
A superfície de um módulo é lida sem executá-lo, e é ela que permite ao check acusar P.naoExiste() antes de rodar. Quando há relay, a superfície é exatamente a lista; quando não há, é tudo o que o topo declara.
Com relay | Sem relay |
|---|---|
| a superfície é a lista | a superfície é tudo do topo |
| mudar um auxiliar não quebra ninguém | qualquer nome do topo virou contrato |
P.auxiliar() é acusado pelo check | passa |
o abi compara só o que é público | compara tudo, e todo rename vira quebra |
O que atravessa a fronteira#
O check não confere só o nome: ele leva o tipo de retorno e os tipos dos parâmetros. Num sistema de duzentos arquivos a maioria das chamadas atravessa módulo, e era exatamente ali que a conferência calava.
dataforge
// pedidos.df
// action criar(id: Integer, cliente: String) -> Pedido: …
// relay criar, Pedido
//
// main.df
// adopt ./pedidos as P
//
// P.criar(1, 2, 3) // check: aridade
// P.criar("um", "Ana") // check: o parametro 'id' e Integer
// P.criar(1, "Ana").clientte // check: o campo, com sugestao
//
// O tipo de retorno e TRADUZIDO para o vocabulario de quem chama:
// '-> Pedido' la e 'P.Pedido' aqui. Devolver o nome nu faria o
// analisador procurar um record que este arquivo nao declara — e
// acusar codigo certo, que e o jeito mais rapido de alguem desligar
// a verificacao.
out "o check atravessa arquivos"Continue em A superfície de um módulo e Compatibilidade.