LuaTeX:luaのベストコーディングプラクティス

Nov 17 2020

複数の外部luaファイルからluaコードを分割してロードし、他のlualatexパッケージからのluaコードを処理する場合に従うべき、最良のコーディング慣行のいくつかは何ですか?ロードして使用できるluaファイルがたくさんあるので、この考えが思い浮かびますが、これは最もきれいに分割されたコードではありません。ここで「サイドノート」として尋ねられるいくつかの質問を、より明確に(そして追加して)以下に繰り返します。

  1. スコープ、および外部luaファイルでの「ローカル変数」の名前の衝突の可能性について:この質問のファイルlinebreak.luaで、ローカル変数のスコープは何local n, head, lastですか?「require」を含む別のluaファイルをロードし、それが同様にローカル変数に名前を付けている場合、それは問題になりますか?luaは、ロード元のファイル内の関数に対してローカル変数をローカルに保持しますか?(グローバル名前空間にロードしただけでも)

  2. ファイル内の変数と関数が別のファイル内の変数と関数と衝突/オーバーライド/干渉しないようにするためのベストプラクティスは何ですか?

  3. グローバル名前空間に何を追加するかを文書化することは、lualatexパッケージ開発者の文書化ガイドラインの一部ですか?lualatexパッケージがグローバル名前空間に名前を書き込み、それが私の変数/関数名と衝突する場合、デバッグを開始するのに最適な場所はどこですか?

  4. 2つの異なるdirectlua / lateluaブロック間のスコープは何ですか?私の観察では、ローカル変数はdirectluaブロックに対してローカルであり、過去にグローバル名前空間を使用して、あるdirectluaブロックから別のdirectluaブロックに値を「渡す」ことになりました。グローバル名前空間の使用を回避するよりクリーンな方法はありますか?

回答

3 JosephWright Nov 17 2020 at 11:18

Lua変数は、それらが定義されている関数またはスコープに対してローカルです。個別のソースファイルがスコープを構成するため、それぞれrequire()が変数がそのファイルに対してローカルであることを意味します。これは\directlua呼び出しにも当てはまりますが、些細なアプリケーションを除いて、Luaコードを1\directlua{require("myfile")}行でロードする必要があります。「\directlua通話間での情報の受け渡し」についてさらにコメントするには、あなたがしていることについてより詳細に説明する必要があると思います。

通常、グローバルを処理する最良の方法は、単一のテーブルを宣言し、その中にすべてのグローバルマテリアルを含めることです。いくつかの方法がありますが、例えば:

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

または

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

必要に応じて、グローバルテーブルの安全性テストを含めることができます

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

グローバル名前空間を処理するための正式なドキュメント/システムはありません。TeXマクロに使用されるのと同じアプローチに従うことをお勧めします。パッケージ名に基づいてわかりやすい名前を選択してください。