2011-01-28 11 views
6

C++ uygulamamın kullanıcıları, küçük iş parçaları gerçekleştirmek için anonim işlevler sağlayabilmelerini istiyorum.Lua'da adlandırılmamış bir işlevi nasıl yükleyebilirim?

Bunun gibi küçük parçalar idealdir. Ben "doğru olanı" yapacak lua_loadstring sanmıyorum Ancak

function(arg) return arg*5 end 

Şimdi

// 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); 

, benim C kodu için bu kadar basit bir şeyi yazabilmek istiyorum.

Korkunç bir kesmek gibi hissettiren şeyle mi kaldım?

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); 

Daha iyi bir çözüm var mı?

cevap

7

Parametrelere erişmeniz gerekirse, yazdığınız yol doğrudur. lua_loadstring, derlediğiniz öbek/kodu temsil eden bir işlevi döndürür. Aslında bir koddan geri bir işlev almak istiyorsanız, return'a sahip olmalısınız. Ben de bunu (Lua'da) küçük "ifade değerlendiricileri" için yapıyorum ve bunu "korkunç bir hack" olarak düşünmüyorum :)

Yalnızca bazı geri aramalara ihtiyacınız varsa, parametreler olmadan, kodu doğrudan yazabilirsiniz ve lua_tostring tarafından döndürülen işlevi kullanın. Bu parçaya parametreler bile geçirebilirsiniz, ... ifadesi ile erişilebilir olacaktır. Sonra gibi parametreler alabilirsiniz:

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

sizin için daha iyidir ne olduğuna karar - Lua fonksiyonları da kütüphane kod temeli içinde "çirkin kod" veya "çirkin kodu".

+0

Ayrıca, bağırsak hislerimin önerdiği kadar da çirkin olmadığına karar verdim. Ve son kullanıcılar lua fonksiyonlarını yazacaklarından beri, "o kadar da korkunç olmayan" hacklerimin gitmenin tek yolu olduğunu düşünüyorum. –

+0

Michal'ın hakkı var. "Yığın" argümanları kabul edebilir, ancak geri dönüşe ihtiyaç duyar. – mlepage

3

ae sayfama bakın. İfadelerin işlevlerini önbelleğe alır, böylece ae_eval("a*x^2+b*x+c") dır ve sadece bir kez derler.

İlgili konular