Quiero que los usuarios de mi aplicación C++ puedan proporcionar funciones anónimas para realizar pequeños fragmentos de trabajo.¿Cómo puedo cargar una función sin nombre en Lua?
Pequeños fragmentos como este serían ideales.
function(arg) return arg*5 end
Ahora me gustaría ser capaz de escribir algo tan simple como esto para mi código 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);
Sin embargo, no creo lua_loadstring va a hacer "lo correcto".
¿Me queda lo que siento como un horrible truco?
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);
¿Existe una solución mejor?
También he decidido que no es tan hacky como mi instinto me sugirió. Y como los usuarios finales van a escribir las funciones lua, creo que mi "no tan horrible" hack es el único camino a seguir. –
Michal tiene razón. El "trozo" puede aceptar argumentos pero necesita la devolución. – mlepage