LuaTeX: lua सबसे अच्छा कोडिंग अभ्यास

Nov 17 2020

कई बाहरी लुआ फ़ाइलों से बंटवारे और लुआ कोड को लोड करने और अन्य लुआटेक्स पैकेज से लुआ कोड से निपटने के लिए सबसे अच्छे कोडिंग प्रथाओं में से कुछ क्या हैं। यह विचार मन में आता है क्योंकि मेरे पास अब लुआ फाइलों का एक गुच्छा है जिसे मैं लोड कर सकता हूं और उपयोग कर सकता हूं, लेकिन यह सबसे साफ रूप से विभाजित कोड नहीं है। "साइड-नोट" के रूप में यहां पूछे गए कुछ प्रश्नों को नीचे अधिक स्पष्टता (और परिवर्धन) के साथ दोहराया गया है:

  1. बाहरी लुआ फाइलों में "लोकल वैरिएबल्स" के स्कोप और संभावित नाम क्लैश के बारे में: इस सवाल के फाइल लाइनब्रेक.लुआ में , लोकल वैरिएबल्स का स्कोप क्या है local n, head, last? अगर मैं "आवश्यकता" के साथ एक और लुआ फ़ाइल लोड करता हूं, और जिसका नाम स्थानीय चर है, तो क्या यह समस्या होगी? क्या स्थानीय फ़ाइल में लोड किए जा रहे कार्यों के लिए लुआ स्थानीय चर रखता है? (भले ही मैंने उन्हें वैश्विक नामस्थान में लोड किया हो)

  2. किसी फ़ाइल में वैरिएबल और फ़ंक्शंस को एक फ़ाइल में उन लोगों के साथ क्लैयरिंग / ओवरराइडिंग / हस्तक्षेप करने से रोकने के लिए सबसे अच्छा अभ्यास क्या है?

  3. यह lualatex पैकेज डेवलपर्स प्रलेखन दिशा निर्देशों का हिस्सा है कि वे वैश्विक नामस्थान में क्या जोड़ रहे हैं? मामले में एक lualatex पैकेज वैश्विक नामस्थान पर एक नाम लिखता है, और यह मेरे चर / फ़ंक्शन नाम के साथ टकराता है, डिबगिंग शुरू करने के लिए सबसे अच्छी जगह क्या है?

  4. दो अलग-अलग डायरेक्ट्लुआ / लेटलुआ ब्लॉक के बीच क्या स्कोपिंग है? मेरे अवलोकन में स्थानीय चर, प्रथलुआ ब्लॉक के लिए स्थानीय हैं, और मैंने पिछले दिशाओं में वैश्विक नामस्थान का उपयोग करते हुए एक डायरेक्ला ब्लॉक से दूसरे में "पास" मूल्यों का उपयोग किया है। वहाँ एक क्लीनर तरीका है कि वैश्विक नाम स्थान का उपयोग करने से बचा जाता है?

जवाब

3 JosephWright Nov 17 2020 at 11:18

Lua वेरिएबल्स उस फ़ंक्शन या स्कोप के लिए स्थानीय होते हैं, जिसमें वे परिभाषित होते हैं। अलग-अलग स्रोत फ़ाइलें स्कोप का गठन करती हैं, इसलिए प्रत्येक का require()मतलब है कि चर उस फ़ाइल के लिए स्थानीय हैं। यह \directluaकॉल के लिए भी सही है , लेकिन तुच्छ अनुप्रयोगों के अलावा, आपको एक \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 मैक्रोज़ के लिए किया जाता है: अपने पैकेज के नाम के आधार पर एक समझदार नाम चुनें।