Pular para o conteúdo

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 1

O 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 relaySem relay
a superfície é a listaa superfície é tudo do topo
mudar um auxiliar não quebra ninguémqualquer nome do topo virou contrato
P.auxiliar() é acusado pelo checkpassa
o abi compara só o que é públicocompara 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.