2016-02-16 15 views
5

मेरे पास एक एप्लिकेशन है जो लुआ स्क्रिप्ट चलाता है। प्रत्येक लुआ स्क्रिप्ट कई बार चलाने की संभावना है। जब भी एक कुंजी दबाया जाता है तो कुछ स्क्रिप्ट भी चल सकती हैं।लुआ - इसे पुनर्स्थापित किए बिना स्क्रिप्ट की स्थिति रीसेट करना

मैं इन स्क्रिप्ट को प्रत्येक रन के बीच "रीसेट" करना चाहता हूं। यदि कोई उपयोगकर्ता एक चर फू सेट करता है, तो अगली बार जब तक उपयोगकर्ता इसे फिर से परिभाषित नहीं करता तब तक फू स्क्रिप्ट में मौजूद नहीं होना चाहिए।

समस्या यह है कि, यदि मैं ऐसा व्यवहार करना चाहता हूं, तो मुझे हर बार एक नया lua_State बनाना होगा, फिर हर बार पुस्तकालयों को खोलें, और फिर प्रत्येक बार स्क्रिप्ट फ़ाइल को पार्स करें, जो बहुत ही अप्रत्याशित लगता है।

लाइब्रेरी लोड करना एक हल्का ऑपरेशन हो सकता है (मुझे लगता है), लेकिन स्क्रिप्ट को पार्स करना शायद नहीं है।

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

धन्यवाद। :)

संपादित: मैं इस विषय पाया लेकिन यह विस्तृत है नहीं करने के लिए के बारे में: http://lua-users.org/lists/lua-l/2006-01/msg00493.html

संपादित: lua_setfenv कि करने के लिए संबंधित प्रतीत होती है। मैं थोड़ा और खोदूँगा।

EDIT: ऐसा लगता है कि LUA 5.2 के रूप में और अधिक lua_setfenv नहीं है। चूंकि मैं 5.3 का उपयोग कर रहा हूं, मुझे ऐसा करने के लिए वातावरण (यानी एक छिपी हुई तालिका नामांकित _ENV जहां चर संग्रहित किया जाता है) सेट करना होगा, और इस प्रकार सबकुछ पुनः लोड करना होगा, जो मैं नहीं करना चाहता ...

+0

क्या आप इसे कोरआउट के साथ लुआ पक्ष कर सकते हैं? – warspyking

उत्तर

1

पिछली बार मैंने देखा कि इसका जवाब दुर्भाग्य से नहीं था।

तुम भी याद रखना होगा कि लुआ पुस्तकालयों, आदि कॉल कर सकते हैं फ़ाइलें, malloc() स्मृति आदि खोल सकता है कि, और, उन फ़ाइलों को बंद करने कि स्मृति को मुक्त कराने के साथ सौदा करने की जरूरत है किसी भी 'रीसेट' है कि, जरूरत

लुआ राज्य को 'रीसेट करने' के विकल्प के रूप में, आप बस अपना कोड व्यवस्थित कर सकते हैं ताकि उसे रीसेट की आवश्यकता न हो; यह स्पष्ट रूप से लूआ कोड को एक विशिष्ट तरीके से लिखा जाना आवश्यक है। ऐसा करने का एक तरीका यह होगा कि आपके लूआ कोड पूरी तरह से (या लगभग पूरी तरह से) फ़ंक्शन के भीतर निहित थे और प्रत्येक क्रिया के लिए एक या अधिक फ़ंक्शन कॉल करते थे। फ़ंक्शंस के बाहर कोड (उदा।) एक लूआ तालिका लौटा सकता है जिसमें विशेष प्रविष्टि बिंदुओं के लिए कॉल करने के संदर्भ शामिल हैं; यह केवल एक बार कहा जाएगा। फ़ंक्शन (ओं), जिन्हें कॉल किया जाता है, किसी भी लाइब्रेरी आवंटित आइटम, खुली फ़ाइलें इत्यादि को समाशोधन सहित स्वयं को साफ़ कर देंगे। वैश्विक चर से बचा जाना चाहिए (जब तक निरंतर नहीं)। हम यह दृष्टिकोण सुनिश्चित करने के लिए सफलतापूर्वक इस दृष्टिकोण का उपयोग करते हैं कि लुआ को केवल एक बार पार्स किया जाता है, प्रवेश बिंदु एक बार निर्धारित होते हैं, लेकिन रिश्तेदार छोटे कार्यों को छोटे ओवरहेड के साथ बहुत तेज़ी से बुलाया जा सकता है।

टिप्पणियों में आपने सुझाव दिया है कि आप एक फ़ंक्शन ब्लॉक में लूआ कोड को स्पष्ट रूप से लपेट सकते हैं।मुझे लगता है कि यह ऊपर दृष्टिकोण से कम लचीला है, और निम्नलिखित नुकसान हैं:

  • आप एक 'एक बार init' (डिस्क से एक निश्चित लगातार पढ़ने उदाहरण के लिए जैसे)

  • करने का अवसर खो देते हैं
  • आप अप्रत्याशित बातों का जोखिम एक उपयोगकर्ता आवेषण (जैसे) एक बेमेल end ... function B() उनके कोड में

  • आप अपने आप को लुआ राज्य प्रति एक प्रवेश बिंदु के लिए विवश हैं।

यह मतलब है कि लुआ कोड (संक्षेप में लुआ सांकेतिक शब्दों में बदलनेवाला फार्म की आवश्यकता में कोड की आपूर्ति की जाती है) एक अलग तरह से लिखा होना चाहिए। इसके आसपास एक संभावित तरीका यह है कि इसे पुस्तकालयों के रूप में बुलाए जाने वाले कोड में require करने के लिए एक निश्चित ढांचे का उपयोग करना है। मैंने उस दृष्टिकोण की कोशिश नहीं की है।

+0

आपकी मदद के लिए धन्यवाद। यदि कुछ पुस्तकालय संसाधन आवंटित कर रहे हैं, तो क्या इन संसाधनों को सभी उपयोगकर्ता चरों को हटाते समय स्वचालित रूप से रिलीज/कचरा एकत्र नहीं किया जाना चाहिए? क्या मैं स्क्रिप्ट चलाने से पहले _ENV में मैन्युअल रूप से सभी मानों को मैन्युअल रूप से हटा सकता हूं और स्टैक को रीसेट करने के लिए lua_settop (0) जैसे कुछ कर सकता हूं? – Virus721

+0

और एक अन्य प्रश्न जो मेरी समस्या को किसी अन्य तरीके से हल कर सकता है: क्या होगा यदि सभी उपयोगकर्ता द्वारा बनाए गए चर को स्थानीय का उपयोग करके परिभाषित किया गया हो, और उसके बाद इसे पर्स करने से पहले एक फ़ंक्शन में लिपटे स्क्रिप्ट किया गया हो? जब समारोह खत्म हो जाएगा, तो यह सब स्थानीय लोगों को नष्ट कर दिया जाएगा? – Virus721

+0

@ वायरस 721 - निश्चित रूप से, यदि प्रोग्राम प्रभावी ढंग से रीसेट हो जाता है (या फिर रीसेट करने की आवश्यकता नहीं है), तो यह काम करेगा। हम जो करते हैं वह उतना ही समान होता है, उसमें वैश्विक स्तर पर यह सिर्फ एक फ़ंक्शन में एक सूचक (आईआईआरसी - लंबे समय से मैंने इसे देखा है) लौटा रहा है, और यह कार्य स्वयं को इस तरीके से चलाया जाना चाहिए जो बाद में साफ़ हो जाए अपने आप। लेकिन मुझे यकीन नहीं है कि कार्यक्रम के बाहर से * मनमानी * लुआ कार्यक्रम को रीसेट करने का एक तरीका है। मुझे नहीं लगता कि 'सभी उपयोगकर्ता चर हटाएं' दृष्टिकोण उड़ जाएगा क्योंकि आपको उस क्रम को जानने की आवश्यकता हो सकती है जिसमें उन्हें हटाना है। – abligh

0

क्या आप lua_State को साफ़ नहीं कर सकते? सभी धागे और मैन्युअल रूप से सेट ग्लोबल्स निकालें। आपको उपयोगकर्ता पर्यावरण को वैश्विक पर्यावरण से अलग करने की आवश्यकता हो सकती है।

+0

क्या "उपयोगकर्ता वातावरण" lua_State से अलग है? – Virus721

+0

एक वैश्विक वातावरण है जिसमें सामान 'टेबल' और 'प्रिंट' आदि शामिल है। कार्यान्वयन के आधार पर, यह उपयोगकर्ता वातावरण भी है। यदि कोई उपयोगकर्ता '' '123 ='' करता है तो वैश्विक वातावरण में फ़ील्ड _a_ है। आप इसे सी-साइड (मैं नहीं जानता कि कैसे) या लुआ पक्ष को एक साधारण getfenv/setfenv (या _ENV) के साथ अलग कर सकते हैं, जो मेटाफिल्ड __index के साथ एक नया वातावरण बना रहा है जो पुराने को इंगित करता है। – EinsteinK

संबंधित मुद्दे