LuaTeX: lua praktik pengkodean terbaik
Apa saja praktik pengkodean terbaik yang harus diikuti saat memisahkan dan memuat kode lua dari beberapa file lua eksternal, dan menangani kode lua dari paket lualatex lainnya. Pikiran ini muncul di benak saya karena sekarang saya memiliki banyak file lua yang dapat saya muat dan gunakan, tetapi ini bukan kode yang terbagi dengan rapi. Beberapa pertanyaan yang diajukan sebagai "Side-catatan" disini diulang di bawah ini dengan lebih jelas (dan penambahan):
Mengenai ruang lingkup, dan kemungkinan benturan nama "variabel lokal" di file lua eksternal: Dalam file linebreak.lua pertanyaan ini , apa cakupan variabel lokal
local n, head, last? Jika saya memuat file lua lain dengan "require", dan memiliki nama variabel lokal yang mirip, apakah itu menjadi masalah? Apakah lua menjaga variabel lokal tetap lokal ke fungsi-fungsi dalam file tempat ia dimuat? (meskipun saya baru saja memuatnya di namespace global)Apa praktik terbaik untuk menjaga variabel dan fungsi dalam file agar tidak bentrok / menimpa / mengganggu yang ada di file lain?
Apakah itu bagian dari pedoman dokumentasi pengembang paket lualatex untuk mendokumentasikan apa yang mereka tambahkan ke namespace global? Jika paket lualatex menulis nama ke namespace global, dan itu bentrok dengan nama variabel / fungsi saya, di mana tempat terbaik untuk memulai debugging?
Apa cakupan antara dua blok directlua / latelua yang berbeda? Dalam pengamatan saya, variabel lokal adalah lokal ke blok directlua, dan saya akhirnya menggunakan namespace global di masa lalu untuk "melewatkan" nilai dari satu blok directlua ke yang lain. Apakah ada cara yang lebih bersih untuk menghindari penggunaan namespace global?
Jawaban
Variabel Lua bersifat lokal ke fungsi atau ruang lingkup di mana mereka didefinisikan. File sumber terpisah membentuk cakupan, jadi masing-masing require()berarti variabel lokal untuk file itu. Ini juga berlaku untuk \directluapanggilan, tetapi selain aplikasi sepele, Anda harus memuat kode Lua menggunakan satu \directlua{require("myfile")}baris. Saya pikir lebih detail tentang apa yang Anda lakukan diperlukan untuk mengomentari lebih lanjut tentang 'menyampaikan informasi antar \directluapanggilan'.
Biasanya, cara terbaik untuk menangani global adalah dengan mendeklarasikan satu tabel dan memiliki semua materi global di dalamnya. Ada beberapa cara, tapi misalnya:
foo = foo or { }
foo.my_func = function(...)
end
atau
foo = foo or { }
local function my_func(...)
end
foo.my_func = foo.my_func or my_func
Jika mau, Anda dapat menyertakan uji keamanan untuk tabel global
if foo then
print("Oh no, someone has taken my table")
os.exit(1)
end
Tidak ada dokumentasi / sistem formal untuk menangani namespace global. Saya sarankan Anda mengikuti pendekatan yang sama seperti yang digunakan untuk makro TeX: pilih nama yang masuk akal berdasarkan nama paket Anda.