Функции, определенные в 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);