2011-01-28 63 views
6

我希望我的C++應用程序的用戶能夠提供匿名函數來執行工作的小塊。如何在Lua中加載一個未命名的函數?

這樣的小片段將是理想的。

function(arg) return arg*5 end 

現在我希望能寫出這麼簡單的東西我的C代碼,

// Push the function onto the lua stack 
lua_xxx(L, "function(arg) return arg*5 end") 
// Store it away for later 
int reg_index = luaL_ref(L, LUA_REGISTRY_INDEX); 

不過,我不認爲lua_loadstring會做「正確的事情」。

難道我留下什麼感覺我像一個可怕的黑客?

void push_lua_function_from_string(lua_State * L, std::string code) 
{ 
    // Wrap our string so that we can get something useful for luaL_loadstring 
    std::string wrapped_code = "return "+code; 
    luaL_loadstring(L, wrapped_code.c_str()); 
    lua_pcall(L, 0, 1, 0); 
} 

push_lua_function_from_string(L, "function(arg) return arg*5 end"); 
int reg_index = luaL_ref(L, LUA_REGISTRY_INDEX); 

有沒有更好的解決方案?

回答

7

如果您需要訪問的參數,你寫的方式是正確的。 lua_loadstring返回一個表示正在編譯的塊/代碼的函數。如果你想真的從代碼中獲得一個函數,你需要return它。我也是這樣做的(在Lua中)對於很少的「表達評估者」,我不認爲它是一個「可怕的黑客」:)

如果你只需要一些回調,沒有任何參數,你可以直接寫代碼並使用lua_tostring返回的函數。您甚至可以將參數傳遞給該塊,它將作爲...表達式訪問。然後你就可以得到參數爲:

local arg1, arg2 = ... 
-- rest of code 

你決定什麼是對你最好 - 「醜陋的代碼」資料庫代碼庫中,或「醜陋的代碼」在您的Lua函數。

+0

我也決定了其不太哈克我的直覺建議。而且由於最終用戶將會寫作lua的功能,我認爲我的「不太可怕」的破解是唯一的出路。 – 2011-01-31 11:11:25

3

看一看我的ae。它從表達式緩存函數,所以你可以簡單地說ae_eval("a*x^2+b*x+c"),它只會編譯一次。

相關問題