Módulos, archivos y plugins
Estado actual: Descubrimiento automático sin import
En Joss, un proyecto se organiza como un conjunto de archivos .joss que comparten un espacio global de declaraciones públicas sin necesidad de escribir sentencias import manuales:
- El cargador canónico
semanticanalyzer.LoadProject("main.joss", "app")construye la unidad de proyecto descubriendo automáticamente el archivo de entrada (main.joss), los archivos de rutas (routes.joss,api.joss) y todos los archivos.jossdentro deapp/(incluyendocontrollers,models,middleware,services,libs,database, etc.). - Ese conjunto validado produce un
PreparedProgramúnico que es consumido directamente porjoss run(Runtime.ExecutePrepared),joss serveryjoss build. - Visibilidad entre archivos:
- Las clases, interfaces, enums y funciones declaradas como
publicson visibles en todos los archivos del proyecto. - Las declaradas como
privateestán restringidas exclusivamente al archivo.jossdonde fueron definidas (JOSS-ACCESS-001).
- Las clases, interfaces, enums y funciones declaradas como
Las formas históricas import, use, @import y Namespace fueron eliminadas del conjunto de tokens, AST, ejecutor y compilador de plugins. El parser las rechaza con un mensaje de migración (JOSS-PARSE-001). Esta ausencia es una decisión permanente del lenguaje: no habrá exports, namespaces fuente ni grafo de imports manuales.
Plugins
La extensibilidad modular externa vigente usa paquetes .jp:
- Se declaran en
joss.yamlo se colocan enplugins/. - El runtime los verifica criptográficamente y los carga automáticamente.
- Cada paquete publica
META-INF/joss-symbols.json. - El analyzer consume ese índice para resolver clases, métodos y funciones exportadas sin ejecutar el plugin.
Un símbolo externo que no figure en el índice no se inventa ni se añade a una lista manual del analyzer: debe corregirse el paquete o su generación de símbolos.
Archivos incluidos por infraestructura
Rutas, controladores, modelos, servicios, librerías y middleware bajo app/ se descubren automáticamente según el layout de proyecto. Esta inclusión física no crea un namespace por archivo; las funciones y clases public top-level comparten el espacio de declaraciones del proyecto y sus duplicados son diagnosticados (JOSS-SYM-002, JOSS-DECL-004).
Biblioteca Estándar (stdlib/)
Joss incluye una biblioteca estándar escrita en el propio lenguaje Joss alojada en la carpeta stdlib/. Todos los archivos y submódulos dentro de stdlib/ se cargan y analizan automáticamente en cada proyecto sin necesidad de importar archivos a mano ni configurar rutas de dependencias.
Módulos disponibles y capacidades
MathUtils(stdlib/math/math.joss):MathUtils::clamp(int $val, int $min, int $max): int: Restringe un valor dentro de un rango inclusivo mínimo y máximo.MathUtils::sign(int $n): int: Retorna1si el número es positivo,-1si es negativo y0si es cero.MathUtils::gcd(int $a, int $b): int: Calcula el máximo común divisor entre dos números enteros mediante el algoritmo de Euclides.
StringUtils(stdlib/strings/strings.joss):StringUtils::isEmpty(string $s): bool: Verifica de forma rápida si una cadena tiene longitud 0.StringUtils::isNotEmpty(string $s): bool: Verifica si una cadena contiene al menos un carácter.StringUtils::padZero(int $num, int $width): string: Rellena un número con ceros a la izquierda hasta alcanzar la longitud especificada.
Ejemplo de uso
int $minimo = MathUtils::clamp(150, 0, 100);
echo $minimo; // 100
int $signo = MathUtils::sign(-45);
echo $signo; // -1
string $codigo = StringUtils::padZero(42, 5);
echo $codigo; // "00042"
Interfaz de funciones foráneas (FFI con C)
Para interactuar con bibliotecas dinámicas nativas (.dll, .so, .dylib), Joss proporciona la sintaxis de bloque extern:
extern "C" library "user32.dll" {
public func MessageBoxA(int $hWnd, string $lpText, string $lpCaption, int $uType): int;
}
Las funciones declaradas dentro de un bloque extern se registran en la tabla global de símbolos y comparten la misma convención directa de código máquina nativo de la CPU.
Decisión frente a la tesis
El capítulo 11 de la tesis describe módulos fuente con interfaces, exports y un DAG. La implementación adopta una decisión distinta: “modular” en ALIM significa capacidades integradas desacopladas y plugins .jp aislados, no imports escritos por la aplicación. Esta discrepancia es deliberada y el diseño de módulos fuente de la tesis no forma parte de la hoja de ruta de Joss.
Las funciones y clases top-level forman un único espacio de declaraciones del proyecto. Las variables fuente top-level no se heredan dinámicamente dentro de funciones con nombre; deben pasar como parámetros. Una closure sí conserva el entorno léxico que captura.