2015-06-09 6 views
6

क्या यह बाइट्स में किसी फ़ंक्शन का आकार प्राप्त करना संभव है या नहीं, यह देखने के लिए कि यह C++ आकार के ऑपरेटर के समान किसी अन्य फ़ंक्शन से मेल खाता है या दो कार्यों का मूल्यांकन करने के लिए किसी अन्य तरीके का मूल्यांकन करता है या नहीं, यह देखने के लिए कि क्या वे वास्तव में फ़ंक्शन/एस के बिना समान हैं कर रहे हैं? उदाहरण:लुआ - क्या यह जांचना संभव है कि 2 कार्य बराबर हैं या नहीं?

local function equals(func1, func2) 
    -- check them and return true if equal 
end 

यदि यह संभव नहीं है तो बस कहें और यह मेरे उत्तर को पूरा करेगा! धन्यवाद!

संपादित करें: एक कार्य का शरीर मुझे यह देखने के लिए आवश्यक है कि यह किसी अन्य फ़ंक्शन के शरीर जैसा ही है या नहीं। स्मृति में संदर्भ अलग होगा इसलिए मैं "==" का उपयोग नहीं कर सकता लेकिन फ़ंक्शन का संदर्भ नाम भिन्न हो सकता है।

+0

'फ़ंक्शन f (x) वापसी x + 1 end' और' function g (x) वापसी x + 1 end' बराबर है? –

+0

हाँ और यह काम करेगा। मुख्य संदर्भ एफ और जी वास्तव में कोई फर्क नहीं पड़ता। मैं सिर्फ यह जांचने का एक तरीका ढूंढ रहा था कि शरीर बराबर है या नहीं। – Mayron

+1

तब तक यह असंभव है जब तक आपके पास स्रोत न हो। एक समारोह i.e. बाइटकोड से लोड किया जा सकता है। –

उत्तर

5

कार्यों के लिए == का उपयोग केवल तभी जांचता है जब वे एक ही फ़ंक्शन का संदर्भ लेते हैं, जो आपको अपेक्षित नहीं है।

यह कार्य कठिन नहीं है, अगर असंभव नहीं है।

function f(x) return x + 1 end 
local g = function(y) return y + 1 end 

f और g दो समारोह है कि अपनी परिभाषा से बराबर हैं कर रहे हैं: वास्तव में साधारण मामलों के लिए, यहाँ एक विचार है। फ़ाइल मान लिया जाये कि t.lua, चलाने है:

luac -l t.lua 

उत्पादन होता है:

main <t.lua:0,0> (4 instructions at 00000000003081c0) 
0+ params, 2 slots, 1 upvalue, 1 local, 1 constant, 2 functions 
     1  [1]  CLOSURE   0 0  ; 0000000000308330 
     2  [1]  SETTABUP  0 -1 0 ; _ENV "f" 
     3  [2]  CLOSURE   0 1  ; 0000000000308dc0 
     4  [2]  RETURN   0 1 

function <t.lua:1,1> (3 instructions at 0000000000308330) 
1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions 
     1  [1]  ADD    1 0 -1 ; - 1 
     2  [1]  RETURN   1 2 
     3  [1]  RETURN   0 1 

function <t.lua:2,2> (3 instructions at 0000000000308dc0) 
1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions 
     1  [2]  ADD    1 0 -1 ; - 1 
     2  [2]  RETURN   1 2 
     3  [2]  RETURN   0 1 

आप देख सकते हैं, दो कार्यों आभासी मशीन में एक ही निर्देश दिया है।

+0

स्पष्टीकरण के लिए धन्यवाद। मुझे लगता है कि जितना करीब होगा उतना करीब होगा। शर्मिंदा कोई आसान तरीका नहीं है लेकिन मुझे करना होगा :) – Mayron

+2

यदि बाइटकोड तक पहुंच आपको समाधान के करीब ले जाती है, तो वहां [lbci] है (http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/# lbci), एक बाइटकोड इंस्पेक्टर लाइब्रेरी (लुआ 5.1 और 5.2 के लिए, LuaRocks के माध्यम से भी इंस्टॉल करने योग्य) @lhf द्वारा लिखी गई है, जो आपको उपरोक्त 'luac -l' के समान जानकारी दे सकती है। – siffiejoe

5

बाइटकोड की तुलना करेंगे?

local function equals(func1, func2) 
    return string.dump(func1) == string.dump(func2) 
end 

निश्चित रूप से, कुछ मामले उपरोक्त विफल होंगे। उदाहरण के लिए:

local function f1 (...) 
    local a = print 
    a(...) 
end 

local function f2 (...) 
    print(...) 
end 


local function equals (f1, f2) 
    return string.dump(f1) == string.dump(f2) 
end 

print(equals(f1,f2)) --> false 

दोनों कार्य एक ही काम करते हैं, लेकिन वे अलग बाइटकोड उत्पन्न करते हैं। हो सकता है कि अगर आप बताएं कि आप क्या हासिल करने की कोशिश कर रहे हैं, तो फ़ंक्शन तुलना से बेहतर समाधान प्रदान किया जा सकता है।

+0

धीमी उत्तर के लिए खेद है। मुझे यह जांचना है कि दो टेबल समान हैं या नहीं, इसलिए यदि वे किसी अन्य तालिका में दिखाई नहीं देते हैं तो एक तालिका में केवल नई प्रविष्टियां जोड़ दी जाती हैं और मैं आसानी से तुलना कर सकता हूं कि कोई मान पहले से ही किसी तालिका में है या नहीं, लेकिन फ़ंक्शंस बहुत ही कठिन हैं जैसे == केवल तुलना करता है मेमोरी पते – Mayron

+0

'string.dump' इसके लिए भी असफल हो जाएगा:' फ़ंक्शन ए() एंड ' ' फ़ंक्शन बी() एंड' 'प्रिंट (स्ट्रिंग डंप (ए) == स्ट्रिंग डंप (बी)) 'आउटपुट' झूठा ' । –

+0

आपको तुलना करने से पहले डंप से डीबग जानकारी को पट्टी करना चाहिए: 'string.dump (f1, true) == string.dump (f2, true)'। यह लुआजिट पर पूरी तरह से काम करता है (लेकिन किसी कारण से लुआ 5.3 पर काम नहीं करता है)। –

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