MySQL- Руководство разработчика

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


Функции, определенные в Lua (и функции C, зарегистрированные в Lua), могут быть вызваны из ведущей программы. Это выполнено, используя следующий протокол: сначала, функция, которая будет вызвана, помещена в стек, затем, параметры функции помещены в прямом порядке, то есть первый параметр помещен в стек первым. В заключение, функция вызвана: int lua_call (lua_State *L, int nargs, int nresults);

Эта функция возвращает те же самые коды ошибки, что и lua_dostring и другие (подробности в разделе

4.5.8). Если Вы хотите исследовать ошибку, вместо того, чтобы возвратить код ошибки, используйте: void lua_rawcall(lua_State *L, int nargs, int nresults);

В обеих функциях nargs задает число параметров, которые Вы поместили в стек. Все параметры и функциональное значение берутся из стека, а функциональные результаты помещены туда. Число результатов будет откорректировано до nresults, если nresults не LUA_MULTRET. В этом случае все результаты функции будут помещены в стек. Функциональные результаты помещены в прямом порядке (первый результат и помещен первым), чтобы после обращения последний результат оказался на самой вершине стека.

Следующий пример показывает, как ведущая программа может делать эквивалент коду на Lua: a,b = f("how", t.x, 4)

Here it is inC:

/* глобальная `t' (потом пригодится) */ lua_getglobal(L, "t"); /* функция, которая будет вызвана */ lua_getglobal(L, "f"); /* 1-ый параметр */ lua_pushstring(L, "how"); /* помещает в стек строку `x' */ lua_pushstring(L, "x"); /* помещает в стек результат t.x (2-ой аргумент) */ lua_gettable(L, -4); /* 3-ий параметр */ lua_pushnumber(L, 4); /* вызывает функцию с 3 параметрами и 2 результатами */ lua_call(L, 3, 2); /* устанавливает глобальную переменную `b' */ lua_setglobal(L, "b"); /* устанавливает глобальную переменную `a' */ lua_setglobal(L, "a"); /* удаляет из стека `t' */ lua_pop(L, 1);

Обратите внимание, что код выше сбалансированный: в конце стек обратен к первоначальной конфигурации. Это считается хорошей практикой.

Некоторые специальные функции Lua имеют собственные интерфейсы C. Ведущая программа может генерировать ошибку Lua, вызывая функцию: void lua_error (lua_State *L, const char *message);


Эта функция никогда не возвращает ничего. Если lua_error вызвана из функции C, которая была вызвана из Lua, то соответствующий блок кода Lua завершается так, как будто ошибка произошла внутри кода Lua. Иначе вся ведущая программа завершается обращением exit(EXIT_FAILURE). Перед завершением выполнения, сообщение message будет передано функции драйвера ошибки _ERRORMESSAGE. Если message равно NULL, то _ERRORMESSAGE не вызывается.

Методы тэгов могут быть изменены с void lua_settagmethod (lua_State *L, int tag, const char *event);

Второй параметр задает тэг, а третий представляет собой имя события. Новый метод берется из стека. Чтобы получить текущее (актуальное) значение метода тэга используйте функцию void lua_gettagmethod(lua_State *L, int tag, const char *event);

Также возможно копировать все методы из одного тэга в другой: int lua_copytagmethods (lua_State *L, int tagto, int tagfrom);

Эта функция вернет tagto.

Вы можете пересекать таблицу с функцией: int lua_next (lua_State *L, int index);

здесь index относится к таблице, которая будет пересечена. Функция берет ключ из стека и помещает туда пару "значение-ключ" из таблицы (следующую после данного ключа). Если не имеется больше элементов, то функция возвращает 0 (и не помещает в стек ничего). Типичный пример использования выглядит следующим образом: lua_pushnil(L); /* first key */ while (lua_next(L, t) != 0) { /* `key' is at index -2 and `value' at index -1 */ printf("%s - %s\n", lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1))); lua_pop(L, 1); /* removes `value'; keeps `index' for next iteration */ }

Функция void lua_concat (lua_State *L, int n);

конкатенирует n значений сверху стека, извлекает их и оставляет результат наверху. Здесь n должно быть по крайней мере равно 2. Конкатенация выполнена по правилам обычной семантики Lua




Содержание раздела