2010-12-22 15 views
13

के लिए प्रिंट() को पुनर्निर्देशित/पुन: परिभाषित करना मैंने अपने सी ++ एप्लिकेशन में लुआ को एम्बेड किया है। मैं प्रिंट स्टेटमेंट्स को पुनर्निर्देशित करना चाहता हूं (या शायद प्रिंट फ़ंक्शन को फिर से परिभाषित कर सकता हूं?), ताकि मैं कहीं और मूल्यांकन अभिव्यक्ति प्रदर्शित कर सकूं।एम्बेडेड लुआ

ऐसा करने का सबसे अच्छा तरीका क्या है: प्रिंट() फ़ंक्शन को पुनर्निर्देशित या फिर से परिभाषित करना?

कोई भी स्निपेट/पॉइंटर्स स्निपेट्स जो दिखाता है कि यह कैसे करना है, इसकी सराहना की जाएगी।

उत्तर

4

luaB_printlbaselib.c में देखें। टिप्पणी वहां पढ़ती है:

/* If you need, you can define your own `print' function, following this 
model but changing `fputs' to put the strings at a proper place (a 
console window or a log file, for instance). */ 

आप बस उस समारोह को संपादित कर सकते हैं या एक नया परिभाषित कर सकते हैं। इसका सरल और पोर्टेबल होने का लाभ है, लेकिन यह io.write (जिसे आप परवाह नहीं कर सकते हैं या नहीं) को संभाल नहीं पाएंगे।

पुनर्निर्देशन IO प्लेटफ़ॉर्म विशिष्ट (जैसे SetStdHandle विंडोज़) नहीं होने वाला है, लेकिन print और io.write का ख्याल रखे बिना किसी भी को फिर से परिभाषित करेगा।

+0

ऐसा लगता है कि लूआ स्रोतों को सीधे संशोधित करने का सुझाव है (मैं गलत हो सकता हूं) - लेकिन निश्चित रूप से, एक बेहतर तरीका होना चाहिए? – skyeagle

+0

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

+0

समाधान माइक एम देता है जो लुआ कोड को छूता नहीं है। आप एक कस्टम प्रिंट फ़ंक्शन प्रदान करते हैं और इसे Lua C फ़ंक्शन 'lua_register (एल, "प्रिंट", my_print) के माध्यम से पंजीकृत करके डिफ़ॉल्ट को ओवरराइड करते हैं। –

2

अपना स्वयं का सी या लुआ फ़ंक्शन लिखें और print को फिर से परिभाषित करें।

10

आप बस लुआ लिपि से प्रिंट को फिर से परिभाषित कर सकते हैं।

local oldprint = print 
print = function(...) 
    oldprint("In ur print!"); 
    oldprint(...); 
end 
22

आप सी में प्रिंट बयान को फिर से परिभाषित कर सकते हैं:

static int l_my_print(lua_State* L) { 
    int nargs = lua_gettop(L); 

    for (int i=1; i <= nargs; i++) { 
     if (lua_isstring(L, i)) { 
      /* Pop the next arg using lua_tostring(L, i) and do your print */ 
     } 
     else { 
     /* Do something with non-strings if you like */ 
     } 
    } 

    return 0; 
} 

फिर वैश्विक तालिका में इसे पंजीकृत:

static const struct luaL_Reg printlib [] = { 
    {"print", l_my_print}, 
    {NULL, NULL} /* end of array */ 
}; 

extern int luaopen_luamylib(lua_State *L) 
{ 
    lua_getglobal(L, "_G"); 
    // luaL_register(L, NULL, printlib); // for Lua versions < 5.2 
    luaL_setfuncs(L, printlib, 0); // for Lua versions 5.2 or greater 
    lua_pop(L, 1); 
} 

आप सी ++ आप शामिल करना होगा उपयोग कर रहे हैं के बाद से अपने 'बाहरी "सी' '

+0

यह बहुत अच्छी तरह से काम करता है। आपका बहुत बहुत धन्यवाद ! –

+0

@ माइकएम। क्या कोई तरीका है इसलिए 'luaL_dostring' पर कॉल करने के लिए इसका उपयोग केवल आवश्यक आउटपुट को 'char *' के रूप में वापस कर दें? – ewok

+0

+1! वास्तव में मुझे @ewok की आवश्यकता है, luaL_dostring एक कॉन्स char * देता है, इसलिए आपके पास बिल्कुल वही है जो आपको चाहिए। –

1

का उपयोग कर फ़ाइल आप निम्न मैक्रोज़ को फिर से परिभाषित कर सकते हैं:

lua_writestring 
lua_writeline 
lua_writestringerror 

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

अपने lauxlib.h या luaconf.h की जांच करें।