Введение в Lua


Выполнение чего-нибудь полезного.


Достаточно настроек, добавим немного функционала. У нас есть всё для того, чтобы создать интерпретатор. В следующем разделе я постараюсь сосредоточится на очень простом интерпретаторе. Никакого редактора, никакой встроенной отладки, только консоль, которая позволит нам печатать команды lua и смотреть на результаты интерпретатора. Нам потребуется узнать еще одну lua функцию:  lua_dostring(). По существу, эта функция выполняет действия в lua. Я не знаю, как по другому объяснить, проще взглянуть на фрагмент кода:

#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.

char* strLuaInput = "a = 1 + 1;\n";

lua_dostring(luaVM, strLuaInput);

lua_close(luaVM);

return 0; }

Выполнение и компилирование этого приложения вернет следующее:

Это совершенно, абсолютно … бесполезно. И что нам сделать, чтобы это стало менее бесполезно? Хорошо, если Вы сползали и скачали lua или видали другие примеры lua, Вам наверное попалась на глаза функция print. Итак, добавим ее в код и возьмем в оборот. Вот код, который мы использовали бы.

#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.



char* strLuaInput = "a = 1 + 1;\nprint( a);\n";

lua_dostring(luaVM, strLuaInput);

lua_close(luaVM);

return 0; }

Компиляция не имеет проблем, а вот выполнение это уже другая история:

Так в чем же дело? Я лгал? Мне кажется, прежде всего, это сообщение означает, что функция 'print' является нулевым (читайте как: пустой указатель) значением. Есть ли фактически функция с именем  print() ? Да, есть, но она не определена как стандартная в среде lua. Нам необходима связь используемой библиотеки с нашим приложением.
Этот механизм, по существу, расширение lua для наших собственных эгоистичных целей. Так или иначе, мы можем заставить работать print() и некоторые другие уместные функции, следующим образом:

#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_baselibopen(luaVM); lua_iolibopen(luaVM); lua_strlibopen(luaVM); lua_mathlibopen(luaVM);

// Используем lua.

char* strLuaInput = "a = 1 + 1;\nprint( a);\n";

lua_dostring(luaVM, strLuaInput);

lua_close(luaVM);

return 0; }
Выполнение кода теперь производит действительный результат:

Я также могу вывести его более наглядно, изменяя команды, посланные lua:
#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_baselibopen(luaVM); lua_iolibopen(luaVM); lua_strlibopen(luaVM); lua_mathlibopen(luaVM);

// Используем lua.

char* strLuaInput = "a = 1 + 1;\nprint( \"1 + 1: \" .. a);\n";

lua_dostring(luaVM, strLuaInput);

lua_close(luaVM);

return 0; }
Проще говоря, результатом будет суммирование 1+1. Так, что я сделал - создал простой пример - эффективная иллюстрация использования скрипт-языка в вашем приложении. Исходник последнего примера может быть найден в предоставленном мной проекте SimpleInterpreter.

Это сравнительно простой материал и мы можем, основываясь на нем, построить простой интерпретатор. Все, что мы должны сделать сейчас - это добавить средства для захвата некоторого текста. Я сделал это в проекте FunctionalInterpreter. Это элементарный интерпретатор и не более чем простое расширение проекта SimpleInterpreter. Я не буду пробегаться по коду.Это просто расширение того, о чем я писал выше.

Страницы: 1 2 3 4 5 Следующая страница Автор: Ash Matheson
Перевод: Alexandr Fedotovskih Комментарии: 13
Версия для печати


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