LuaTeX: lua Best Coding Practices

Nov 17 2020

Was sind einige der besten Codierungsmethoden, die beim Teilen und Laden von Lua-Code aus mehreren externen Lua-Dateien und beim Umgang mit Lua-Code aus anderen Lualatex-Paketen zu beachten sind? Dieser Gedanke kommt mir in den Sinn, da ich jetzt eine Reihe von Lua-Dateien habe, die ich laden und verwenden kann, aber es ist nicht der am saubersten unterteilte Code. Einige Fragen, die hier als "Randnotiz" gestellt werden, werden im Folgenden mit mehr Klarheit (und Ergänzungen) wiederholt:

  1. In Bezug auf den Umfang und mögliche Namenskonflikte von "lokalen Variablen" in externen Lua-Dateien: Welchen Umfang haben lokale Variablen in der Datei linebreak.lua dieser Fragelocal n, head, last ? Wenn ich eine andere Lua-Datei mit "require" lade und diese ähnlich benannte lokale Variablen hat, wäre das ein Problem? Hält lua lokale Variablen lokal für die Funktionen in der Datei, aus der es geladen wird? (auch wenn ich sie gerade in den globalen Namespace geladen habe)

  2. Was ist die beste Vorgehensweise, um zu verhindern, dass Variablen und Funktionen in einer Datei mit denen in einer anderen Datei kollidieren / überschreiben / stören?

  3. Ist es Teil der Dokumentationsrichtlinien der Entwickler von Lualatex-Paketen, zu dokumentieren, was sie dem globalen Namespace hinzufügen? Wenn ein Lualatex-Paket einen Namen in den globalen Namespace schreibt und mit meinem Variablen- / Funktionsnamen kollidiert, wo kann ich am besten mit dem Debuggen beginnen?

  4. Was ist der Umfang zwischen zwei verschiedenen Directlua / Latelua-Blöcken? In meiner Beobachtung sind lokale Variablen lokal für Directlua-Blöcke, und ich habe in der Vergangenheit einen globalen Namespace verwendet, um Werte von einem Directlua-Block an einen anderen zu "übergeben". Gibt es einen saubereren Weg, der die Verwendung eines globalen Namespace vermeidet?

Antworten

3 JosephWright Nov 17 2020 at 11:18

Lua-Variablen sind lokal für die Funktion oder den Bereich, in dem sie definiert sind. Separate Quelldateien bilden Bereiche, sodass jede require()Variable lokal für diese Datei ist. Dies gilt auch für \directluaAnrufe, aber abgesehen von einfachen Anwendungen sollten Sie Lua-Code in einer einzigen \directlua{require("myfile")}Zeile laden . Ich denke, dass mehr Details darüber erforderlich sind, was Sie tun, um weitere Kommentare zum Thema "Weitergabe von Informationen zwischen \directluaAnrufen" abzugeben.

Normalerweise besteht der beste Weg, mit Globals umzugehen, darin, eine einzelne Tabelle zu deklarieren und das gesamte globale Material darin zu enthalten. Es gibt einige Möglichkeiten, aber zum Beispiel:

foo = foo or { }
foo.my_func = function(...)
end

oder

foo = foo or { }
local function my_func(...)
end
foo.my_func = foo.my_func or my_func

Wenn Sie möchten, können Sie einen Sicherheitstest für die globale Tabelle hinzufügen

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

Es gibt keine formale Dokumentation / System für die Behandlung des globalen Namespace. Ich würde vorschlagen, dass Sie den gleichen Ansatz wie für TeX-Makros verfolgen: Wählen Sie einen sinnvollen Namen basierend auf Ihrem Paketnamen.