Importar módulos
adopt: stdlib, arquivo ao lado, caminho relativo e pacote.
As formas#
dataforge
adopt Arcane.Math as M // biblioteca padrão
adopt validador as V // pacote instalado
adopt ./util as U // arquivo ao lado
adopt ./lib/formato as F // numa subpasta
adopt ../compartilhado/config as C // subindo
adopt "src/legado.df" as L // caminho literalImportar só o que usa#
dataforge
adopt Arcane.Math.{sqrt, floor} // forma compacta
adopt {sqrt as raiz} from Arcane.Math
adopt ./util.{dobro, VERSAO}O nome entra direto no escopo — sqrt(16), não Math.sqrt(16). Útil para o que se usa muito; para o resto, o prefixo documenta de onde veio.
Onde o adopt procura#
Nesta ordem:
- Biblioteca padrão —
Arcane.*e os nomes curtos (Math,IO,Text) - Ao lado do arquivo que faz o import, não do diretório de onde se rodou
- `forge_modules/`, subindo até achar um
forge.toml
Exportar#
dataforge
action publica():
yield interna() * 2
action interna():
yield 21
relay publica // 'interna' fica dentro do móduloSem nenhum relay, o módulo exporta tudo o que definiu no topo — conveniente para script. Num pacote, declare explicitamente: é o que separa a API do detalhe.
Fachada#
dataforge
// lib/index.df
relay from ./util
relay from ./mat
// app.df
adopt ./lib/index as Lib // uma API só, vários módulos dentrorelay from re-exporta tudo o que aquele módulo exporta. É o que permite quebrar a implementação em vários arquivos sem que quem consome precise saber disso. O nome local vence o re-exportado.
Ciclos#
Dois módulos que se importam são detectados, com o caminho completo:
text
erro[DF0501]: Circular import: b.df → a.df → b.df.
Break the cycle by moving the shared part into a third module.Tipos vindos de módulo#
dataforge
adopt ./tipos as T
p := T.Ponto(1, 2) // record
c := spawn T.Caixa(7) // blueprint
out T.Cor.Azul // enum
out T.dobro(21) // ação