Imports y namespaces
Un módulo Bagron es un archivo .bg. import carga otro módulo y deja
disponibles sus definiciones públicas. El nombre del módulo debe ser un
identificador simple, sin extensión, rutas ni componentes ...
Import con namespace
import math
import standard as std
func main() int32:
return math.double(21) + std.answer()
Sin alias, el namespace usa el nombre del módulo. Con as, usa el alias
declarado. Las definiciones no se filtran al ámbito local: se acceden como
namespace.nombre.
Import selectivo
import { double as twice, answer } from math
func main() int32:
return twice(answer)
El import selectivo crea nombres locales directos. Cada símbolo debe ser público y un alias local no puede repetirse ni chocar con otro símbolo. Funciones, variables globales y tipos públicos pueden seleccionarse.
Resolución de archivos
Para import nombre, el compilador busca:
nombre.bgonombre/main.bgjunto al módulo importador cuando este vive bajomodules/;modules/nombre.bgomodules/nombre/main.bgen la raíz del proyecto;- el mismo patrón en la raíz del proyecto como fallback para proyectos antiguos.
La ruta final debe permanecer dentro de la raíz del proyecto. libs/ no es una
raíz implícita para módulos .bg; se reserva para archivos .lib declarados
con library.
Exportaciones y privacidad
Las declaraciones son públicas por defecto:
; math.bg
private func helper() int32:
return 1
public func answer() int32:
return helper()
Otro módulo puede importar answer, pero no helper. La privacidad se
comprueba también para variables, tipos, clases, agregados y funciones
externas. Un símbolo privado sigue existiendo para validar su propio módulo;
simplemente no forma parte de sus exportaciones.
Firmas y ciclos
Un alias conserva la firma original, incluidos los parámetros expansivos:
; arrays.bg
func total(values: int32[], length: Len_t, size: Size_t) int32:
return length
; main.bg
import { total as sum } from arrays
func main() int32:
values: int32[3] = {1, 2, 3}
return sum(values)
El llamador no escribe Len_t ni Size_t; la expansión se conserva al
resolver el alias. Los ciclos de imports se rechazan, por ejemplo:
main.bg -> a.bg -> b.bg -> a.bg
La carga ocurre antes de validar los cuerpos: primero se resuelve el árbol, después se registran firmas y tipos, y finalmente se comprueban los usos y la visibilidad.