Состояние модуля (или: Кто имеет VM?)
Первая вещь, о которой мы должны узнать - то, что lua является по существу конечным автоматом. Дополнительно, lua - виртуальная машина. Мы к этому немного вернемся (я надеюсь). Так или иначе, как только Вы подключили свой программный интерфейс к lua, Вы можете посылать команды lua через функцию lua_dostring. Я немного забегаю вперед. Вернемся назад и начнем по порядку с интерпретатора.
Прежде всего, в значительной степени каждая функция в lua имеет дело с состоянием lua [lua state]. Это по существу определяет текущее состояние lua интерпретатора; следит за функциями, глобальными переменными и дополнительной связанной с интерпретатором информацией в этой структуре. Вы создаете состояние lua [lua state] запросом lua_open. Эта функция выглядит примерно так:
lua_State *lua_open (int initialStackSize);
Если хотите, можете думать о lua_State как о дескрипторе текущего экземпляра lua интерпретатора. Это справедливая аналогия.
Так, если мы получаем непустой указатель в lua_State, мы знаем, что lua сумел инициализироваться правильно. Это хорошо и означает, что теперь мы можем использовать lua для своих нужд. Но по умолчанию мы можем сделать совсем немного. Это если кратко.
Давайте разработаем некоторый код и используем его как отправную точку. lua_open() описана в lua.h (Вы можете найти его в каталоге include). Так, попробуйте скомпилировать следующий фрагмент кода как win32 консольное приложение:
#include <stdio.h> #include <lua.h>
int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if (NULL == luaVM) { printf("Error Initializing lua\n"); return -1; } return 0; } |
К сожалению, это не будет работать. Если точнее, проблема в связях. Это довольно простая проблема, но одна из тех, которые обычно происходят когда Вы имеете дело с Открытыми Исходными проектами. По существу, lua был написан на чистом ANSI C. Пожалуйста обратите внимание: я сказал ANSI C. И еще обратите внимание что все файлы в библиотеке lua имеют расширение "c".
Это по существу означает, что способ, которым компилятор прессует имена всех функций lua, основан на C соглашении о вызовах. Это отличается от описателей имен функций C++. Не сложно пофиксить, но немного раздражает. Чтобы излечится от этого, просто оберните *include и остальные операторы включения ссылающиеся на lua библиотечные функции в:
extern "C" { //... } |
#include <stdio.h> extern "C" { #include <lua.h> } int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if (NULL == luaVM) { printf("Error Initializing lua\n"); return -1; } return 0; } |
Так, сейчас Вы вероятно задумались о том, что если мы использовали оператор 'open', то соответственно нуждаемся в операторе close. И Вы были правы. lua_close() по существу закрывает состояние, которое было открыто lua_open() . Все так и есть. Формат lua_close() напоминает следующее:
void lua_close (lua_State *openState);
Мы можем завершить наш код выше, добавив это в приложение:
#include <stdio.h> extern "C" { #include <lua.h> } int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if( NULL == luaVM ) { printf("Error Initializing lua\n"); return -1; } // Используем lua. lua_close( luaVM ); return 0; } |