- •4.2 Среда и составные части
- •4.3 Типы и тэги
- •4.4 Язык
- •4.4.1 Лексические соглашения в языке
- •4.4.2 Приведение
- •4.4.3 Корректировка
- •4.4.4 Инструкции
- •4.4.4.1 Блоки
- •4.4.4.2 Присваивания
- •4.4.4.3 Структуры управления
- •4.4.4.4 Инструкция For
- •4.4.4.5 Обращения к функции как инструкции
- •4.4.4.6 Локальные объявления
- •4.4.5 Выражения
- •4.4.5.1 Базисные выражения
- •4.4.5.2 Арифметические операторы
- •4.4.5.3 Реляционные операторы
- •4.4.5.4 Логические операторы
- •4.4.5.5 Объединения
- •4.4.5.6 Старшинство
- •4.4.5.7 Конструкторы таблиц
- •4.4.5.8 Вызовы функций
- •4.4.5.9 Определение функций
- •4.4.6 Зона видимости и Upvalues
- •4.4.7 Обработка ошибок
- •4.4.8 Методы тэгов
- •4.5.1 Состояния
- •4.5.2 Стек и индексы
- •4.5.3 Манипуляции со стеком
- •4.5.4 Запросы к стеку
- •4.5.5 Помещение значений в стек
- •4.5.6 Уборка мусора
- •4.5.7 Userdata и тэги
- •4.5.8 Выполнение Lua-кода
- •4.5.9 Управление глобальными переменными в Lua
- •4.5.10 Управление таблицами в Lua
- •4.5.11 Использование таблиц как массивов
- •4.5.12 Вызов функций Lua
- •4.5.13 Определение функций c
- •4.5.14 Ссылки к Lua-объектам
- •4.5.15 Системный реестр
- •4.6 Стандартные библиотеки
- •4.6.1 Базисные функции
- •4.6.2 Строковые манипуляции в Lua
- •Шаблоны Символьный класс:
- •Элемент образца:
- •Шаблоны:
- •Сборы данных:
- •4.6.3 Математические функции
- •4.6.4 Средства ввода-вывода
- •4.6.5 Средства системы
- •4.7 Интерфейс отладки
- •4.7.1 Информация стека и функций
- •4.7.2 Управление локальными переменными
- •4.7.3 Обработчики прерываний
- •4.7.4 Рефлексивный интерфейс отладки
- •4.8 Lua в автономном режиме
- •Изменения в библиотеках
- •Изменения в api
- •4.12 Полный синтаксис Lua
- •4.13 Lua: интерпретатор языка Lua Синтаксис
- •Описание
- •4.14.1 Что Вы получаете
- •4.14.2 Проблемы и некоторые решения
- •4.14.3 Разделяемые библиотеки
- •4.14.4 Установка на Windows или Macintosh
4.5.8 Выполнение Lua-кода
Ведущая программа может выполнять Lua-chunk, записанные в файле или в строке, используя следующие функции:
int lua_dofile(lua_State *L, const char *filename);
int lua_dostring(lua_State *L, const char *string);
int lua_dobuffer(lua_State *L, const char *buff, size_t size,
const char *name);
Эти функции возвращают 0 в случае успеха, или один из следующих кодов ошибки, если они терпят неудачу:
LUA_ERRRUN: ошибка при управлении chunk.
LUA_ERRSYNTAX: ошибка синтаксиса в течение прекомпиляции.
LUA_ERRMEM: ошибка распределения памяти. Для таких ошибок, Lua не вызывает _ERRORMESSAGE (подробности в разделе 4.4.7).
LUA_ERRERR: ошибка при управлении _ERRORMESSAGE. Для таких ошибок Lua не вызывает _ERRORMESSAGE снова, чтобы избежать циклов.
LUA_ERRFILE: ошибка открытия файла (только для lua_dofile). В этом случае Вы можете проверять errno, вызывая strerror или perror, чтобы сообщить пользователю, что пошло неправильно.
Эти константы определены в lua.h.
Когда функция lua_dofile вызвана с параметром NULL, она выполняет поток stdin. lua_dofile и lua_dobuffer способны выполнить прекомпилируемые объекты кода. Они автоматически обнаруживают, является ли кусок кода текстовым или двоичным, и загружают его соответственно. lua_dostring выполняет только исходный текст, заданный в простой текстовой форме.
Третий параметр для lua_dobuffer задает имя chunk, который используется сообщениях об ошибках и отладочных сообщениях. Если имя name равно NULL, то Lua дает заданное по умолчанию имя этому chunk.
Эти функции помещают в стек любые значения, в конечном счете возвращенные кодом. Код может возвращать любое число значений; Lua соблюдает осторожность, в том плане, что эти значения вписываются в размер стека, но после обращения ответственность переходит к Вам. Если Вы должны поместить другие элементы после вызова любой из этих функций, и Вы хотите работать спокойно, Вы должны или проверить место в стеке с помощью lua_stackspace, или удалять возвращенные элементы из стека (если Вы не нуждаетесь в них). Например, следующий код загружает код в файле и отбрасывает все результаты, возвращенные этим кодом:
{
int oldtop = lua_gettop(L);
lua_dofile(L, filename);
lua_settop(L, oldtop);
}
4.5.9 Управление глобальными переменными в Lua
Чтобы прочитать значение глобальной переменной Lua, надо:
void lua_getglobal (lua_State *L, const char *varname);
Это помещает в стек значение данной переменной. Как в Lua эта функция может вызывать метод тэга для события getglobal. Чтобы читать реальное значение глобальной переменной без того, чтобы вызывать любой метод тэга, используют lua_rawget над таблицей глобальных переменных.
Чтобы записать значение в глобальнукю переменную:
void lua_setglobal (lua_State *L, const char *varname);
Это извлекает из стека значение, которое будет сохранено в данной переменной. Как в Lua эта функция может вызывать метод тэга для события setglobal. Чтобы устанавливать реальное значение глобальной переменной без того, чтобы вызывать любой метод тэга, используют lua_rawset над таблицей глобальных переменных (подробности приведены ниже).
Все глобальные переменные сохраняются в обычной Lua-таблице. Вы можете получать ее вызовом:
void lua_getglobals (lua_State *L);
Это помещает текущую (актуальную) таблицу глобальных переменных в стек. Чтобы устанавливать другую таблицу глобальных переменных, используйте вызов:
void lua_setglobals (lua_State *L);
Таблица, которую нужно использовать, извлекается из стека.
