
- •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.2 Среда и составные части
Все инструкции в Lua выполнены в глобальной среде. Эта среда будет инициализирована обращением к lua_open и сохранится до обращения к lua_close или до завершения ведущей программы. В случае необходимости программист может создавать много независимых глобальных сред и свободно переключаться между ними.
Глобальная среда может управляться Lua-кодом или ведущей программой, которая может читать и писать глобальные переменные, используя функции API из библиотеки, которая предоставлена Lua.
Глобальные переменные в Lua не должны быть объявлены. Любая переменная считается глобальной, пока не объявлена явно как локальная. Перед первым назначением, значение глобальной переменной nil (это значение по умолчанию может быть изменено, подробности в разделе 4.4.8). Таблица используется, чтобы хранить все глобальные имена и значения (таблицы объясняются в разделе 4.3).
Модуль выполнения Lua назван составной частью. Это просто последовательность инструкций, которые выполнены последовательно. Каждая инструкция может факультативно сопровождаться точкой с запятой:
chunk ::= {stat [`;']}
Инструкции описаны в разделе 4.4.4. Запись выше представляет собой обычный расширенный BNF, в котором {a} соответствует 0 или более объектов a [a] означает факультативный a, а (a)+ задает один или большее количество a. Полный синтаксис Lua дан в BNF.
Составная часть (chunk) может быть сохранена в файле или в строке в ведущей программе. Когда chunk выполняется, сначала проводится прекомпиляция в байт-код для реальной машины, а затем инструкции будут выполнены в последовательном порядке, моделируя действительную машину. Все модификации глобальной среды сохраняются после окончания работы кода.
Chunk также может быть прекомпилирован в двоичную форму и сохранен в файле. Подробности есть в описании программы luac. Текстовые файлы с кодом и их двоичные прекомпилированные формы взаимозаменяемы. Lua автоматически обнаруживает тип файла и действует соответственно.
4.3 Типы и тэги
Lua представляет собой dynamically typed language. Это означает, что переменные не имеют типов, а только значения. Следовательно, не имеется никаких определений типов на языке. Все значения несут их собственный тип. Помимо типа все значения также имеют тэг.
Имеются шесть базисных типов в Lua: nil, number (число), string (строка), function (функция), userdata (пользовательские данные) и table (таблица). Nil тип значения nil, чье основное свойство должно отличаться от любого другого значения. Number представляет реальные (двойная точность с плавающей запятой) числа, в то время как string имеет обычное значение. Lua нормально понимает 8-разрядные символы, так что строки могут содержать любой 8-разрядный символ, включая вложенные нули ('\0'). Подробности в разделе 4.4.1. Функция type возвращает строку, описывающую тип данного значения (подробности в разделе 4.6.1).
Функции рассматриваются как значения первого класса (first-class values) в Lua. Это означает, что функции могут быть сохранены в переменных, переданы как параметры другим функциям и возвращены как результаты. Lua может вызывать и управлять как функциями, написанными на Lua, так и функциями, написанными на C. Два вида функций могут различаться их тэгами: все функции Lua имеют тот же самый тэг, и все функции C имеют свой тэг, который отличается от тэга функций Lua. Функция tag возвращает тэг данного значения (подробности в разделе 4.6.1).
Тип userdata обеспечивается, чтобы позволить произвольным C-указателям быть сохраненными в Lua-переменных. Этот тип соответствует void* и не имеет никаких предопределенных операций в Lua, за исключением теста равенства и назначения. Однако, используя методы тэгов, программист может определять операции для значений userdata. Подробности в разделе 4.4.8.
Тип table осуществляет ассоциативные массивы, то есть массивы, которые могут быть индексированы не только числами, а любыми значениями (за исключением nil). Следовательно, этот тип может использоваться не только, чтобы представить обычные массивы, но также и символные таблицы, наборы, записи, графы, деревья и т.д. Таблицы представляют собой основной механизм, структурирующий данные в Lua. Чтобы представлять записи (records), Lua использует имя поля как индекс. Язык поддерживает это представление, обеспечивая a.name как синтаксический аналог для a["name"]. Таблицы могут также нести методы: поскольку функции представляют собой значения первого класса, поля таблицы могут содержать функции. Форма t:f(x) синтаксический аналог для t.f(t,x), который вызывает метод f из таблицы t прохождением таблицы непосредственно как первый параметр (подробности в разделе 4.4.5.9).
Обратите внимание, что таблицы представляют собой объекты, а не значения. Переменные не содержат таблицы, только ссылаются на них. Назначение, обработка параметра и возврат всегда управляют ссылками на таблицы и не подразумевают никакого вида копирования. Кроме того, таблицы должны быть явно созданы прежде, чем используются. Подробности в разделе 4.4.5.7.
Каждый из типов nil, number и string имеет свой тэг. Вообще, очень многое в Lua построено именно вокруг тэгов. Все значения каждого из этих типов имеют тот же самый предопределенный тэг. Как объяснено выше, значения типа function могут иметь два различных тэга в зависимости от того, являются ли они функциями Lua или функциями C. В заключение, значения типов userdata и table могут иметь переменные тэги, назначенные программистом (подробности в разделе 4.4.8). Функция tag возвращает тэг данного значения. Пользовательские тэги могут быть созданы функцией newtag. Функция settag используется, чтобы изменить тэг таблицы (подробности в разделе 4.6.1). Тэг значений userdata может быть установлен из C (подробности в разделе 4.5.7). Тэги главным образом используются, чтобы выбрать соответствующие методы тэгов, когда происходят некоторые события. Методы тэгов представляют собой основной механизм для распространения семантики Lua (подробности в разделе 4.4.8).