Вызов функции Lua - PullRequest
       8

Вызов функции Lua

7 голосов
/ 23 июня 2011

Я хотел бы обработать следующий код в Lua и C:

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

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

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

Ответы [ 5 ]

6 голосов
/ 23 июня 2011

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

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

4 голосов
/ 23 июня 2011

Как правило, вы не сохраняете функцию в переменной 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 */
}

Для краткости я пропустил проверку ошибок, но см. Программирование на Lua для более полного примера и Справочное руководство Lua для более подробной информации о функциях.

4 голосов
/ 23 июня 2011

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

1 голос
/ 23 июня 2011

Эта страница также может быть полезна: http://www.lua.org/pil/25.2.html

И это: http://www.luafaq.org/#T7.2

И, похоже, здесь ответили: как вызвать функцию lua изфункция переменного тока

0 голосов
/ 23 июня 2011

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

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