Стандартный интерпретатор командной строки для Lua является примером такой программы. В окнах это небольшой исполняемый файл, который связан с lua52.dll
. Его источником является, конечно, часть the Lua distribution.
Несмотря на то, что он находится в той же папке, что и источники Lua DLL, lua.c
ссылается только на общедоступный API для Lua и зависит только от четырех общих файлов заголовков и самой DLL.
Еще более простой пример, который встраивает интерпретатор Lua в программе C заключается в следующем, полученный из the example shown in the PiL book available online:
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main (void) {
char buff[256];
int error;
lua_State *L = luaL_newstate(); /* create state */
luaL_openlibs(L); /* open standard libraries */
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff), "line") ||
lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); /* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
В существующем приложении, вам нужно будет позвонить luaL_newstate()
раз и хранить возвращенный дескриптор. Наряду с призывом к luaL_openlibs()
вы, скорее всего, захотите также определить один или несколько модулей Lua, представляющих API-интерфейс, доступный для вашего приложения. И, конечно же, вам нужно позвонить lua_close()
когда-нибудь, прежде чем выйти, чтобы у Lua была возможность очистить свои объекты и, в частности, возможность иметь дело с любыми объектами, которые авторы сценария зависят от того, чтобы получить ресурсы, выпущенные при выходе приложения.
С помощью этого места вы обычно предоставляете способ загрузить фрагменты скриптов, предоставленные вашим пользователем, используя luaL_loadbuffer()
или любую другую функцию, созданную поверх lua_load()
. Загрузка скрипта компилирует его и оставляет анонимную функцию в верхней части стека, которая при вызове будет выполнять все инструкции верхнего уровня в скрипте.
Подробнее об этом см. В главах Programming in Lua (older addition is available online), которые относятся к API C.
С надлежащими макросами приведенный выше код можно превратить в действительный код C, который вызывает Lua API. Но этот код C еще нужно скомпилировать в ваше приложение. И функции, которые вы экспортируете в Lua, должны быть тем, что ожидает Lua API, хотя вы, вероятно, можете избежать этого, используя FFI, например, в LuaJIT. – lhf
Да, и ваш MyFunction1 и т. Д. Могут быть написаны на C, C++, C# и т. Д., Java и, конечно же, Lua. Я полагаю, вы имели в виду.Вы получите более качественные ответы, если вы скажете, что и дать больше контекста. –