Как я могу загрузить безымянную функцию в Lua? - PullRequest
6 голосов
/ 28 января 2011

Я хочу, чтобы пользователи моего приложения на C ++ могли предоставлять анонимные функции для выполнения небольших кусков работы.

Небольшие фрагменты, подобные этому, были бы идеальными.я хотел бы иметь возможность написать что-то столь же простое для моего 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);

Есть ли лучшее решение?

Ответы [ 2 ]

7 голосов
/ 28 января 2011

Если вам нужен доступ к параметрам, то вы правильно написали. lua_loadstring возвращает функцию, представляющую блок / код, который вы компилируете. Если вы действительно хотите получить функцию из кода, вы должны return ее. Я также делаю это (в Lua) для маленьких "оценщиков выражений", и я не считаю это "ужасным хаком":)

Если вам нужны только некоторые обратные вызовы без каких-либо параметров, вы можете напрямую написать код и использовать функцию, возвращаемую lua_tostring. Вы даже можете передать параметры этому чанку, он будет доступен как выражение .... Тогда вы можете получить параметры как:

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

Вы сами решаете, что лучше для вас - "уродливый код" внутри вашей кодовой базы библиотеки или "уродливый код" в ваших функциях Lua.

3 голосов
/ 28 января 2011

Посмотрите на мои AE .Он кэширует функции из выражений, поэтому вы можете просто сказать ae_eval("a*x^2+b*x+c") и скомпилировать его только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...