- •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.4.5.8 Вызовы функций
Вызовы функций в Lua имеют синтаксис:
functioncall ::= varorfunc args
Сначала вычисляется varorfunc. Если значение имеет тип function, то эта функция будет вызвана с данными параметрами. Иначе вызывается метод function тэга, имея первым параметром значение varorfunc с перечисленными затем первоначальными параметрами обращения. Подробности в разделе 4.4.8.
Форма
functioncall ::= varorfunc `:' name args
Может использоваться, чтобы вызвать methods. Обращение v:name(...) синтаксически аналогично v.name(v, ...), за исключением того, что v будет оценен только однажды. Параметры имеют следующий синтаксис:
args ::= `(' [explist1] `)'
args ::= tableconstructor
args ::= literal
explist1 ::= {exp1 `,'} exp
Все выражения параметра оценены перед обращением. Обращение в форме f{...} синтаксически аналогично f({...}), то есть список параметров представляет собой одиночную новую таблицу. Обращение в форме f'...' (f"..." или f[[...]]) синтаксически аналогично f('...'), то есть список параметров представляет собой одиночную строку литералов.
Потому, что функция может возвращать любое число результатов, число результатов должно быть откорректировано прежде, чем они используются. Если функция вызвана как инструкция, то список возврата откорректирован к 0, таким образом отбрасывая все возвращенные значения. Если функция вызвана в месте, которое нуждается в одиночном значении (синтаксически обозначенном нетерминальным exp1), то список возврата откорректирован к 1, таким образом отбрасывая все возвращенные значения, но не первый. Если функция вызвана в месте, которое может использовать много значений (синтаксически обозначено нетерминальным exp), то никакая корректировка не будет сделана. Единственные места, которые могут обрабатывать много значений, это последние (или единственные) выражения в присваивании, в списке параметров или в инструкции return. Имеются примеры:
f() -- 0 результатов
g(f(), x) -- f() 1 результат
g(x, f()) -- g получает x и все значения, возвращенные f()
a,b,c = f(), x -- f() скорректирован к 1 результату (и c получает nil)
a,b,c = x, f() -- f() 2 результата
a,b,c = f() -- f() 3 результата
return f() -- возвращает все значения, возвращенные f()
return x,y,f() -- вернет a, b и все, что вернет f()
4.4.5.9 Определение функций
Синтаксис для определения функций такой:
function ::= function `(' [parlist1] `)' block end
stat ::= function funcname `(' [parlist1] `)' block end
funcname ::= name | name `.' name | name `:' name
Инструкция
function f () ... end
является только синтаксическим аналогом для
f = function () ... end
а инструкция
function v.f () ... end
является синтаксическим аналогом для
v.f = function () ... end
Функциональное определение представляет собой выполнимое выражение, чье значение имеет тип function. Когда Lua прекомпилирует chunk, все функциональные тела также прекомпилируются. Затем, всякий раз, когда Lua выполняет функциональное определение верхние переменные (upvalues) фиксируются, и функция выполняется. Этот функциональный образец (или замкнутое выражение) представляет собой конечное значение выражения. Различные образцы той же самой функции могут иметь различные верхние переменные.
Параметры действуют как локальные переменные, инициализированные со значениями параметра:
parlist1 ::= `...'
parlist1 ::= name {`,' name} [`,' `...']
Когда функция вызвана, список параметров будет откорректирован к длине списка параметров, если функция не vararg-функция, которая обозначена тремя точками (`...') в конце списка параметра. Функция vararg не корректирует список параметров, вместо этого она собирает все лишние параметры в неявный параметр, названный arg. Значением arg является таблицы из n полей, чьим значением является число параметров дополнительного пространства и сами эти параметры, перечисленные в полях 1, 2, ..., n.
Как пример, рассмотрите следующие определения:
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
Имеем следующее отображение параметров:
ВЫЗОВ ПАРАМЕТРЫ
f(3) a=3, b=nil
f(3, 4) a=3, b=4
f(3, 4, 5) a=3, b=4
f(r(), 10) a=1, b=10
f(r()) a=1, b=2
g(3) a=3, b=nil, arg={n=0}
g(3, 4) a=3, b=4, arg={n=0}
g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2}
g(5, r()) a=5, b=1, arg={2, 3; n=2}
Результаты возвращены, используя инструкцию return. Если управление достигает конца функции без того, чтобы столкнуться с инструкцией return, то функция будет завершена без результатов.
Синтаксис
funcname ::= name `:' name
используется для определения методов, то есть функции, которые имеют неявный дополнительный параметр self .
Инструкция
function v:f (...) ... end
является только синтаксическим аналогом для
v.f = function (self, ...) ... end
Обратите внимание, что функция получает дополнительный формальный параметр self.
