2012-11-18 18 views
5

Lua संस्करण 5.2 के लिए एक मुफ्त ऑनलाइन reference manual के साथ आता है (जिसका मैं उपयोग कर रहा हूं) और Programming in Lua संस्करण 5.0 के लिए भी उपलब्ध है।लुआ 5.2 को एम्बेड करना और पुस्तकालयों को परिभाषित करना

हालांकि, इन संस्करणों के बीच कुछ बदलाव हुए हैं जिन्हें मैं पार करने में सक्षम नहीं हूं। परिवर्तन 5.2 और 5.1 के संदर्भ मैनुअल के लगातार संस्करणों में उल्लेखनीय हैं। luaL_register() के पक्ष में luaL_register()luaL_setfuncs() के पक्ष में luaL_openlib() के लगातार बहिष्करण पर ध्यान दें।

वेब पर खोज मिश्रित परिणाम देती हैं, जिनमें से अधिकांश luaL_register() पर इंगित करती हैं।

क्या मैं प्राप्त करने के लिए मिनी कार्यक्रम द्वारा संक्षेप किया जा सकता है नीचे कि संकलित और कहते हैं के साथ जोड़ा जा सकता है की कोशिश, gcc ./main.c -llua -ldl -lm -o lua_test

#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 

#include <stdio.h> 
#include <string.h> 


static int test_fun_1(lua_State * L) 
{ 
    printf("t1 function fired\n"); 
    return 0; 
} 

int main (void) 
{ 
    char buff[256]; 
    lua_State * L; 
    int error; 

    printf("Test starts.\n\n"); 

    L = luaL_newstate(); 
    luaL_openlibs(L); 

    lua_register(L, "t1", test_fun_1); 

    while (fgets(buff, sizeof(buff), stdin) != NULL) 
    { 
     if (strcmp(buff, "q\n") == 0) 
     { 
      break; 
     } 
     error = luaL_loadbuffer(L, buff, strlen(buff), "line") || 
       lua_pcall(L, 0, 0, 0); 
     if (error) 
     { 
     printf("Test error: %s\n", lua_tostring(L, -1)); 
     lua_pop(L, 1); 
     } 
    } 
    lua_close(L); 

    printf("\n\nTest ended.\n"); 
    return 0; 
} 

यह काम करता है उम्मीद और t1() टाइपिंग अपेक्षित परिणाम का उत्पादन के रूप में।

अब मैं लुआ के लिए एक लाइब्रेरी/पैकेज दृश्यमान बनाना चाहता हूं। Programming in Lua सलाह हमें to use एक सरणी और एक लोड समारोह:

static int test_fun_2(lua_State * L) 
{ 
    printf("t2 function fired\n"); 
    return 0; 
} 

static const struct luaL_Reg tlib_funcs [] = 
{ 
    { "t2", test_fun_2 }, 
    { NULL, NULL } /* sentinel */ 
}; 

int luaopen_tlib (lua_State * L) 
{ 
    luaL_openlib(L, "tlib", tlib_funcs, 0); 

    return 1; 
} 

तो luaL_openlibs() के बाद luaopen_tlib() का उपयोग करें। ऐसा करने से हम tlib:t2() का उपयोग करने की अनुमति देते हैं यदि हम LUA_COMPAT_MODULE (संगत मोड में काम करते हैं) को परिभाषित करते हैं।

लुआ 5.2 में ऐसा करने का उचित तरीका क्या है?

int luaopen_tlib (lua_State * L) 
{ 
    luaL_newlib(L, tlib_funcs); 
    return 1; 
} 

और main समारोह में, अगर आप इस तरह मॉड्यूल लोड होनी चाहिए::

उत्तर

8

luaopen_tlib समारोह है कि जिस तरह से लिखा जाना चाहिए

int main (void) 
{ 
    // ... 
    luaL_requiref(L, "tlib", luaopen_tlib, 1); 
    // ... 
} 

या वैकल्पिक रूप से, आप एक प्रवेश जोड़ सकते हैं {"tlib", luaopen_tlib}linit.c में loadedlibs तालिका में।

+0

luaL_openlibs वैकल्पिक है और शायद वहां नहीं होना चाहिए (उदाहरण के लिए)। – Cubic

+0

मैंने उदाहरण संपादित किया ताकि केवल महत्वपूर्ण पंक्ति दिखायी जा सके। – prapin

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