2013-10-01 60 views
2

訪問功能我寫了這個簡單的庫:的Lua 5.2無法在C庫

#include "lua.h" 
#include "lauxlib.h" 

static int l_or(lua_State *l) 
{ 
    int i, result = 0; 
    int nargs = lua_gettop(l); 
    for(i = 1; i <= nargs; ++i) 
    { 
    result |= lua_tointeger(l, i); 
    } 

    lua_pushnumber(l, result); 
    return 1; 
} 

static const luaL_Reg mybit [] = { 
    {"or", l_or}, 
    {NULL, NULL} /* sentinel */ 
}; 

int __declspec(dllexport) luaopen_mybit (lua_State *L) 
{ 
     luaL_newlibtable(L, mybit); 
     luaL_setfuncs(L, mybit,0); 
     return 1; 
} 

編譯到一個名爲中是指mylib.dll DLL。

然後我測試使用獨立的Lua解釋使用下面的腳本:

print ("Test script") 

mybit = require("mybit") 
print(mybit) 

mybit.or(1,2,3) 
--print(mybit.or) 

當我運行該腳本,我得到以下輸出:

lua: test.lua:6: <name> expected near 'or' 

根據我的所有例子看着這應該是完美的。如果我註釋掉mybit.or(1,2,3)我得到

Test script 
table: 005A8EB8 

所以我相當有信心,該庫被加載。我的問題是,我不明白爲什麼我不能使用點運算符訪問或函數。

我使用的是使用mingw-gcc編譯的Lua 5.2。

回答

6

or是Lua中的保留字(它是邏輯或運算符)。這就是爲什麼Lua中所有現有的按位運算庫都將其命名爲bor的函數。 andnot類似地保留。 (保留字的完整列表,可以發現here。)

,您仍然可以調用它使用字符串:

print(mybit["or"](1,2,3)) 
print(mybit["or"]) 

但是你掉現有以下位運算庫和命名的例子更好它不是or

+0

當我試圖讓它工作時,我設法使用一個字符串來調用函數。雖然它看起來不太優雅 - 但直到有人指出我已經使用了其中一個保留字時才意識到。 – jgashby

2

您正在使用or作爲函數名稱,它是Lua中的關鍵字,請嘗試其他名稱,例如my_or

+0

這是工作,謝謝。我想這是幾乎任何其他例子都會第一次運作的情況! – jgashby

+0

@jgashby有些語言同時具有'||'和'或'作爲關鍵字。對於Lua來說,只有'或'。順便說一句,我認爲Lua中一個更容易被遺忘的關鍵詞是'in'。 –