Bienvenidos sean a este post, Lua permite a los nombres de los modulos ser jerarquicos por medio de un punto para separar los distintos niveles, al igual que otros lenguajes de este estilo un modulo llamado mod.sub equivale a decir que es un submodulo de mod, con esto podemos asumir que el modulo mod.sub definira todos los valores dentro de una tabla mod.sub que en realidad es una tabla de mod con una clave llamada sub, el paquete (package) es un arbol de modulos, esta es la unidad de distribucion en Lua, cuando se requiera un modulo llamado mod.sub la funcion require busca primero la tabla package.loaded y la tabla package.preload usando el nombre del modulo original «mod.sub» como la clave, el punto no tiene importancia en la búsqueda.
Sin embargo cuando buscas por un archivo que define ese submodulo require transforma el punto en otro caracter que usualmente es el separador del directorio del sistema (p.e. ‘/’ para Unix, ‘\’ para Windows), despues de esta transformacion require busca por el nombre resultante como cualquier otro nombre, por ejemplo asumamos el siguiente path:
./?.lua;/usr/local/lua/?.lua;/usr/local/lua/?/init.lua
Tomemos al separaor de directorio como ‘/’ entonces una llamada a ‘a.b’ intentara abrir los siguientes archivos:
./a/b.lua
/usr/local/lua/a/b.lua
/usr/local/lua/a/b/init.lua
Esta conducta permite a todos los modulos de una paquete para estar en un directorio simple, si un paquete tiene los modulos p, p.a y p.b sus respectivos archivos pueden ser nombrados:
p/init.lua p/a.lua p/b.lua
Con el directorio p dentro del directorio apropiado, el separador de directorio es configurado en el momento de compilacion y puede ser cualquier caracter, recuerden que Lua no conoce nada de directorios, por ejemplo sistemas sin jerarquias de directorios pueden usar a ‘_’ como el separador de directorio, asi que el siguiente llamado:
require "a.b"
Buscara por el archivo a_b.lua, los nombres de la funciones de C no pueden contener puntos, asi que una libreria de C para un submodulo a.b no puede exportar una funcion luaopen_a.b, en este caso require transforma el punto en otro caracter (el guion bajo (_)), en el caso de una libreria de C llamada a.b tendra una funcion de inicializacion con el nombre lua_open_a_b, tambien podemos usar el truco de los guiones con algunos resultados sutiles, por ejemplo si tenemos una libreria de C llamada a y queremos hacerla un submodulo de mod, podemos renombrar el archivo a mod/-a cuando escribimos require «mod.-a«, la funcion encuentra correctamente el nuevo archivo mod/-a asi como a la funcion luaopen_a dentro de ella, como una facilidad extra require tiene una opcion mas para cargar submodulos de C, cuando no puedes encontrar ni un archivo de Lua o un archivo de C para un submodulo, busca de nuevo el path de C pero esta vez buscando por el nombre del paquete.
Por ejemplo si el programa requiere un submodulo a.b.c y require no puede encontrar un archivo cuando busca por a/b/c esta ultima busqueda lo hara por a, si encuentra una libreria de C con este nombre, require mira dentro de esta libreria por una funcion abierta apropiada, luaopen_a_b_c para este ejemplo, esta facilidad permite a una distribucion poner varios submodulos juntos dentro de una simple libreria de C, cada una con su propia funcion.
La funcion module tambien ofrece soporte explicito para submodulos, cuando creamos un submodulo con la llamada module(«a.b.c«) pone la tabla de entorno dentro de la variable a.b.c, que en realidad es un campo c de una tabla en un campo b de la tabla a, si cualquiera de estas tablas intermedias no existen, module las crea de lo contrario las reusa, desde el punto de vista de Lua submodulos en el mismo paquete no tienen otra relacion explicita mas que sus tablas de entorno puedan ser anidadas, el requerimiento del modulo a no carga automaticamente cualquiera de sus submodulos asi como el requirimiento a.b no carga automaticamente al modulo a, por supuesto el implementador del paquete es libre de crear estos enlaces si quiere, por ejemplo a un modulo particular como a podria iniciar por solicitar explicitamente uno o todo sus submodulos.
En resumen, hoy hemos visto que son los submodulos, que son, para que sirven, como el conjunto de submodulos crea al paquete, como se utilizan, para que sirvan, factores a tener en cuenta, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50