LuaTeX: lua migliori pratiche di codifica

Nov 17 2020

Quali sono alcune delle migliori pratiche di codifica da seguire quando si divide e si carica codice lua da più file lua esterni e si ha a che fare con il codice lua da altri pacchetti lualatex. Questo pensiero mi viene in mente poiché ora ho un mucchio di file lua che posso caricare e utilizzare, ma non è il codice diviso in modo più pulito. Un paio di domande poste come "Nota a margine" qui vengono ripetute di seguito con maggiore chiarezza (e aggiunte):

  1. Per quanto riguarda l'ambito e il possibile conflitto di nomi di "variabili locali" nei file lua esterni: Nel file linebreak.lua di questa domanda , qual è l'ambito delle variabili locali local n, head, last? Se carico un altro file lua con "require" e che ha variabili locali denominate in modo simile, sarebbe un problema? Lua mantiene le variabili locali locali rispetto alle funzioni nel file da cui viene caricato? (anche se li ho appena caricati nello spazio dei nomi globale)

  2. Qual è la migliore pratica per evitare che variabili e funzioni in un file si scontrino / sovrascrivono / interferiscono con quelle in un altro file?

  3. Fa parte delle linee guida per la documentazione degli sviluppatori di pacchetti lualatex documentare cosa stanno aggiungendo allo spazio dei nomi globale? Nel caso in cui un pacchetto lualatex scrive un nome nello spazio dei nomi globale e si scontra con il mio nome di variabile / funzione, qual è il posto migliore per iniziare il debug?

  4. Qual è lo scoping tra due diversi blocchi directlua / latelua? Nella mia osservazione le variabili locali sono locali rispetto ai blocchi directlua, e ho finito per usare lo spazio dei nomi globale in passato per "passare" valori da un blocco directlua a un altro. Esiste un modo più pulito che eviti di utilizzare lo spazio dei nomi globale?

Risposte

3 JosephWright Nov 17 2020 at 11:18

Le variabili Lua sono locali rispetto alla funzione o all'ambito in cui sono definite. I file di origine separati costituiscono gli ambiti, quindi ciascuno require()significa che le variabili sono locali per quel file. Questo vale anche per le \directluachiamate, ma a parte le applicazioni banali, dovresti caricare il codice Lua usando una singola \directlua{require("myfile")}riga. Penso che siano necessari maggiori dettagli su ciò che stai facendo per commentare ulteriormente il "passaggio di informazioni tra le \directluachiamate".

In genere, il modo migliore per gestire le globali è dichiarare una singola tabella e avere tutto il materiale globale in essa. Ci sono alcuni modi, ma ad esempio:

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

Se lo desideri, puoi includere un test di sicurezza per la tabella globale

if foo then
  print("Oh no, someone has taken my table")
  os.exit(1)
end

Non esiste una documentazione / sistema formale per la gestione dello spazio dei nomi globale. Ti suggerirei di seguire lo stesso approccio usato per le macro TeX: scegli un nome ragionevole in base al nome del tuo pacchetto.