LuaTeX: mejores prácticas de codificación de lua
¿Cuáles son algunas de las mejores prácticas de codificación a seguir al dividir y cargar código lua desde varios archivos lua externos y al tratar con código lua de otros paquetes lualatex? Este pensamiento me viene a la mente ya que ahora tengo un montón de archivos lua que puedo cargar y usar, pero no es el código dividido de la manera más limpia. Un par de preguntas formuladas como "Nota al margen" aquí se repiten a continuación con más claridad (y adiciones):
En cuanto al alcance, y posible choque de nombres de "variables locales" en archivos lua externos: En el archivo linebreak.lua de esta pregunta , ¿cuál es el alcance de las variables locales
local n, head, last? Si cargo otro archivo lua con "require", y que tiene variables locales con nombres similares, ¿sería eso un problema? ¿Mantiene lua las variables locales locales a las funciones en el archivo desde el que se está cargando? (incluso si los cargué en el espacio de nombres global)¿Cuál es la mejor práctica para evitar que las variables y funciones de un archivo entren en conflicto, anulen o interfieran con las de otro archivo?
¿Es parte de las pautas de documentación de los desarrolladores de paquetes lualatex documentar lo que están agregando al espacio de nombres global? En caso de que un paquete lualatex escriba un nombre en el espacio de nombres global y entre en conflicto con el nombre de mi variable / función, ¿cuál es el mejor lugar para comenzar a depurar?
¿Cuál es el alcance entre dos bloques de directlua / latelua diferentes? En mi observación, las variables locales son locales para los bloques de directlua, y he terminado usando el espacio de nombres global en el pasado para "pasar" valores de un bloque de directlua a otro. ¿Existe una forma más limpia que evite el uso del espacio de nombres global?
Respuestas
Las variables Lua son locales a la función o ámbito en el que están definidas. Los archivos de origen separados constituyen ámbitos, por lo que cada uno require()significa que las variables son locales para ese archivo. Esto también es cierto para las \directluallamadas, pero aparte de las aplicaciones triviales, debe cargar el código Lua usando una sola \directlua{require("myfile")}línea. Creo que se necesitan más detalles sobre lo que está haciendo para comentar más sobre "pasar información entre \directluallamadas".
Normalmente, la mejor manera de manejar los globales es declarar una sola tabla y tener todo el material global en ella. Hay algunas formas, pero por ejemplo:
foo = foo or { }
foo.my_func = function(...)
end
o
foo = foo or { }
local function my_func(...)
end
foo.my_func = foo.my_func or my_func
Si lo desea, puede incluir una prueba de seguridad para la tabla global
if foo then
print("Oh no, someone has taken my table")
os.exit(1)
end
No hay documentación / sistema formal para manejar el espacio de nombres global. Le sugiero que siga el mismo enfoque que se utiliza para las macros TeX: elija un nombre sensato según el nombre de su paquete.