2013-03-06 5 views
5

Section 4.1 of Programming in Lua से।एकाधिक असाइनमेंट कैसे काम करता है?

एक बहु काम में, लुआ पहले सभी मूल्यों का मूल्यांकन करता है और उसके बाद ही कार्य निष्पादित करता है। इसलिए, हम दो मानों स्वैप करने के लिए, में

एक्स के रूप में एक से अधिक काम उपयोग कर सकते हैं, वाई y, x = - स्वैप x' for वाई '

कैसे काम काम वास्तव में करता है?

+1

"वास्तव में काम" से आपका क्या मतलब है? पुस्तक * समझाया * यह कैसे काम करता है। आप और क्या खोज रहे हैं? –

उत्तर

10

कितने असाइनमेंट लागू किए जाते हैं इस पर निर्भर करता है कि आप किस लुआ का उपयोग कर रहे हैं। कार्यान्वयन चीजों को करने के लिए स्वतंत्र है, वैसे भी जब तक यह अर्थशास्त्र को बरकरार रखता है। इससे कोई फर्क नहीं पड़ता कि चीजें कैसे लागू होती हैं, आपको उसी परिणाम मिलना चाहिए जैसे कि आपने एलएचएस को सौंपने से पहले आरएचएस में सभी मूल्यों को बचाया था, क्योंकि लुआ पुस्तक बताती है।


आप अभी भी वास्तविक क्रियान्वयन के बारे में उत्सुक हैं, तो एक बात आप कर सकते हैं देखने के बाईटकोड कि एक निश्चित कार्यक्रम के लिए उत्पादन किया जाता है क्या है। उदाहरण के लिए, निम्नलिखित कार्यक्रम

local x,y = 10, 11 
x,y = y,x 

लेने और लुआ 5.2 के लिए बाईटकोड संकलक (luac -l) करने के लिए इसे पारित

main <lop.lua:0,0> (6 instructions at 0x9b36b50) 
0+ params, 3 slots, 1 upvalue, 2 locals, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 10 
    2 [1] LOADK  1 -2 ; 11 
    3 [2] MOVE  2 1 
    4 [2] MOVE  1 0 
    5 [2] MOVE  0 2 
    6 [2] RETURN  0 1 

चाल opcode बाईं रजिस्टर करने का अधिकार रजिस्टर में मूल्य प्रदान करती है देता है (अधिक जानकारी के लिए लुआ स्रोत में lopcodes.h देखें)। जाहिर है, क्या हो रहा है कि रजिस्ट्रार 0 और 1 का उपयोग x और y और स्लॉट 2 के लिए अस्थायी अतिरिक्त स्लॉट के रूप में किया जा रहा है। x और y पहले दो opcodes में और अगले तीन 3 opcodes एक स्वैप "अस्थायी" दूसरे स्लॉट का उपयोग किया जाता है में स्थिरांक के साथ प्रारंभ हो, एक तरह से है जैसे आप हाथ से करना होगा:

tmp = y -- MOVE 2 1 
y = x -- MOVE 1 0 
x = tmp -- MOVE 0 2 

को देखते हुए कैसे लुआ एक स्वैपिंग असाइनमेंट और एक स्थिर प्रारंभिकरण करते समय एक अलग दृष्टिकोण का उपयोग किया जाता है, अगर आपको विभिन्न प्रकार के एकाधिक असाइनमेंट के लिए अलग-अलग परिणाम मिलते हैं तो मुझे आश्चर्य नहीं होगा (सेटिंग तालिका फ़ील्ड शायद बहुत अलग दिखने जा रही हैं, खासकर तब से ऑर्डर करना चाहिए metamethods के कारण ...)। हमें उस स्रोत में हिस्सा ढूंढना होगा जहां बाइटकोड 100% सुनिश्चित हो जाता है। और जैसा कि मैंने पहले उल्लेख किया था, यह सब लुआ संस्करणों और कार्यान्वयन के बीच भिन्न हो सकता है, विशेष रूप से यदि आप लुआजिट बनाम पुक लुआ को देखते हैं।

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