2011-06-22 2 views
7

Я хотел бы, чтобы обрабатывать следующий код в Lua и C:Вызов функции Lua

Давайте предположим, что у меня есть функция C с именем Foo, который связан с Lua. Я называю это как следующее в Lua скрипте:

Foo(15, "bar", function(z) return 2 * z + 1 end) 

На стороне C, я получить аргументы и я могу сохранить номер и строку в моей структуре. Но какой тип данных мне понадобится для хранения анонимной функции? И как я могу назвать это позже?

ответ

4

Вы можете либо оставить функцию где-то в стеке, либо сохранить ее в реестре или в какой-либо другой таблице с помощью luaL_ref.

6

Вы не можете сохранить функцию Lua как C тип данных больше, чем вы можете сохранить таблицу Lua как тип данных C.

Что нужно сделать, это использовать the registry, чтобы сохранить это значение. Реестр представляет собой глобально доступную таблицу для всех пользователей C для хранения данных. Часто бывает полезно выбрать один ключ для всего кода и поставить таблицу на этот ключ. Эта таблица будет содержать значения, которые вы хотите сохранить. Это поможет уменьшить конфликты с другим кодом C с помощью реестра.

4

Как правило, вы не храните функцию в переменной C. Вы оставите его в стеке и назовите его с помощью pcall(). Что-то вроде:

int l_Foo(lua_State *L) 
{ 
    lua_pop(L, 2);   /* ignore the first two args */ 
         /* (the function is now on top of the stack) */ 
    lua_pushnumber(L, 2); /* push the number to pass as z */ 
    lua_pcall(L, 1, 1, 0); /* call the function with 1 argument, expect 1 result */ 
    lua_pop(L, 1);   /* ignore the result */ 
} 

Я оставил некоторую проверку ошибок для краткости, но увидеть Programming in Lua для более полного примера и the Lua Reference Manual для получения более подробной информации о функциях.

0

Одним из способов было бы сделать работу анонимной функции на стороне Lua и передать результат функции FOO(int, char*, fun_result_type fun_result)

Смежные вопросы