Extension:Scribunto/Lua reference manual/ru

Введение
Это руководство по Lua в том виде, в каком он используется в MediaWiki с расширением Scribunto. Некоторые части производны от Lua 5.1 reference manual, доступного под MIT-style license.

This derivative manual may also be copied under the terms of the same license.

Первые шаги
На википроекте с MediaWiki с подключенным Lua создайте страницу с заголовком, начинающимся с, например,. На эту новую страницу скопируйте текст:

Сохраните страницу, а на другой странице (не модуле) напишите:

(где  надо заменить на название вашего модуля). В результате будет вызвана функция, экспортируемая этим модулем. будет заменено на текст, возвращаемый функцией, в данном случае на «Hello, world!».

Обычно желательным является обращение к Lua через посредство шаблонов. В таком случае с позиции вызывающей страницы не важно, произведена конструкция средствами Lua или викитекста. Также это позволяет избегать дополнительного усложнения синтаксиса в содержательных пространствах имён.

Документирование модулей
Scribunto позволяет документировать модули на подстраницах в пространстве имён ; по умолчанию подстраница документации называется   и включается на странице модуля над кодом. Например, документация к  будет лежать на.

Это можно настраивать посредством следующих сообщений пространства MediaWiki:
 * scribunto-doc-subpage-name: Устанавливает имя подстраницы документации. Указанные тут подстраницы будут интерпретироваться как викитекст, а не код Lua, и их нельзя будет вызывать через . По умолчанию.
 * scribunto-doc-subpage-does-not-exist: Сообщение, показываемое, когда страницы нет. Имя подстраницы подставляется через . По умолчанию пусто.
 * scribunto-doc-subpage-show: Сообщение, показываемое, когда страница документации есть. Имя подстраницы подставляется через . По умолчанию включение страницы документации.
 * scribunto-doc-subpage-header: Шапка при показе самой страницы документации. Имя документируемого модуля передаётся через . По умолчанию это короткое пояснение курсивом.

Литералы
Имена (они же идентификаторы) в Lua могут состоять из латинских букв, цифр и знаков подчёркивания, но не начинаться с цифры. Имена чувствительны к регистру; "foo", "Foo" и "FOO" — это разные имена.

Следующие ключевые слова зарезервированы и не могут использоваться как имена:  Имена, начинающиеся с подчёркивания, за которым следует заглавная буква, зарезервированы для внутренних глобальных переменных Lua.
 * and
 * break
 * do
 * else
 * elseif
 * end
 * false
 * for
 * function
 * if
 * in
 * local
 * nil
 * not
 * or
 * repeat
 * return
 * then
 * true
 * until
 * while

Другие литералы: 
 * &#x25;
 * &#x3a;
 * &#x3b;
 * ]
 * }
 * &#x3a;
 * &#x3b;
 * ]
 * }
 * &#x3a;
 * &#x3b;
 * ]
 * }
 * &#x3b;
 * ]
 * }
 * ]
 * }
 * ]
 * }
 * ]
 * }
 * }
 * }
 * }

Комментарии
Комментарии начинаются с, употреблённого где угодно вне строковых констант. Если за  непосредственно следуют открывающиеся длинные скобки, комментарий продолжается до закрывающих длинных скобок; иначе комментарий заканчивается вместе с текущей строкой кода.

Типы данных
Lua — язык с динамической типизацией: переменные и аргументы функций типа не имеют, тип присущ только присвоенным им значениям. Все значения несут какой-либо тип.

В Lua основных типов данных восемь, но в расширении Scribunto используются только шесть. Функция  возвращает тип значения.

Функция  преобразует значение в строку. Функция  преобразует значение в число, если это возможно, иначе возвращает nil. Явных функций для преобразования других типов данных нет.

Числа преобразуются в строки автоматически при использовании там, где ожидается строка, например, в операторе конкатенации. Строки, опознаваемые, автоматически преобразуются в числа при употреблении с арифметическими операторами.

nil
"Nil" — это тип данных для, показывающего отсутствие значения. Nil не может быть ключом в таблице, а запись таблицы со значением nil не отличается от отсутствующего ключа.

При преобразовании в строку результат "nil", в логическое ложь (false).

Логические (boolean)
Логическое значение — это либо  (истина), либо   (ложь).

В строки преобразуются как "true" и "false". В отличие от многих других языков, логицеские значения не могут быть непосредственно преобразованы в числовые. Ещё одна особенность Lua в том, что только false и nil считаются ложными при преобразовании к логическому типу; число 0 и пустая строка преобразуются в true.

Строки (string)
Строки в Lua — это последовательности байтов по 8 бит; конкретную кодировку им задаёт применение.

Строковые литералы можно заключать в 'одинарные' или "двойные" кавычки; как в JavaScrpit и не как в Perl и PHP, разницы между ними нет. Распознаются специальные ESC-последовательности: '\a' (звонок), '\b' (шаг назад), '\f' (перевод страницы), '\n' (перевод строки), '\r' (возврат каретки), '\t' (горизонтальная табуляция), '\v' (вертикальная табуляция), '\\' (обратная косая черта), '\"' (двойная кавычка) и '\&#x27;' (одинарная кавычка). Собственно перевод строки может быть включена в строковой литерал, если перед ним стоит '\'. Байты можно также вводить последовательностями '\ddd', где ddd — десятичное значение байта (0—255). Символы юникода требуется вводить по отдельным байтам кодировки UTF-8; обычно проще вставить в строку сам символ.

Строковые литералы также можно задавать, используя длинные скобки. Открывающая длинная скобка состоит из открывающей квадратной скобки '[', за которой следуют ноль или более знаков равенства '=', за которыми следует ещё одна открывающая квадратная скобка '[', например,:,   или. Открывающей длинной скобке должна соответствовать закрывающая длинная скобка: соответственно,,   или. ESC-последовательности в строках, ограниченных длинными скобками, не работают. Кроме того, если за открывающей длинной скобкой сразу следует разрыв строки, он не включается в строку.

Все строки, включая пустые, преобразуются к логическому значению.

Числа (number)
В Lua есть только один числовой тип, обычно внутренне представляемый числами с плавающей запятой двойной точности. В этом формате целые числа от -9007199254740992 до 9007199254740992 представляются точно, а некоторые за пределами этого диапазона — с погрешностью округления.

Десятичным разделителем является точка, разделители групп не разрешены, например,. Также числа можно записывать в экспоненциальной нотации без пробелов, например,,   или. Целые числа также могут быть представлены в шестнадцатеричной форме после, например,.

Хотя нечисловые значения и бесконечности обоих знаков корректно хранятся и обрабатываются, в Lua нет таких литералов. Константа  — это положительная бесконечность, она же получается делением типа , а частное типа   может быть использовано для быстрого получения NaN'а.

Все числа, включая 0, преобразуются в логический тип к true. При преобразовании в строки конечные числа представляются в десятичной форме, возможно, в экспоненциальной нотации; нечисловые значения преобразуются в "nan" или "-nan", а бесконечности — в "inf" или "-inf".

Таблицы (table)
Таблицы Lua — это ассоциативные массивы, подобные массивам в PHPили объектам в JavaScript.

Таблицы создаются при помощи фигурных скобок. — это пустая таблица. Чтобы заполнить её значениями, внутри скобок может быть задан список полей, разделённых запятыми или точками с запятой. Определения могут иметь несколько форм:
 * — результат выполнения expression1 (первый, если их несколько) становится ключом, а expression2 — значением;
 * эквивалентно ;
 * примерно эквивалентно, где i — порядковый номер поля, начиная с 1. Если expression возвращает несколько значений и является последним элементом в определении таблицы, присваиваются все значения с соответствующими номерами, иначе — только первое.

К полям таблиц обращаются с помощью квадратных скобок, например,. Если ключ является корректным литералом, можно обращаться к нему через точку, т.е. эквивалентно. Вызвать функцию, являющуюся значением таблицы и принимающую таблицу в качестве аргумента, можно с помощью двоеточия:, что эквивалентно.

Последовательность — это таблица, составленная из непустых значений, сопоставленных ключам — всем положительным целым числам от 1 до N, и не имеющая значений (отличных от nil), сопоставленных каким-либо числам больше N. Многие функции Lua работаю только с последовательностями, а значения, не сопоставленные с положительными целыми ключами, игнорируются.

В отличие от PHP и JavaScript, в качестве ключа можно использовать любое значение, за исключением nil и NaN, и преобразование типов не выполняется. Ниже перечислены корректные примеры:

Аналогично, любое значение, за исключением nil, может быть элементом таблицы. При записи nil удаляется соответствующий ключ, а попытка доступа к отсутствующей записи возвращает nil.

Заметьте, что таблицы не копируются при присвоении. Если таблицу передать в качестве аргумента, функция будет работать с данными исходной таблицы, а не с копией, и все изменения будут видны из вызывающей функции.

Преобразование таблицы в строку даёт, но поведение можно переопределить, используя метаметод. При преобразовании таблицы в логический тип всегда возвращается true, даже если таблица пуста.

Функции (function)
Функции в Lua — объекты первого класса: можно создавать анонимные функции, передавать их как аргументы, присваивать переменным и т.п.

Функции создаются с помощью ключевого слова, а вызываются с помощью круглых скобок. Есть синтаксический сахар для именованных функций, локальных функций и для функций, работающих в качестве методов — членов таблицы. Подробности изложены ниже в разделах Объявления функций и Вызовы функций.

Функции Lua являются замыканиями: они сохраняют ссылку на область видимости, в которой были определены, и могут обращаться и производить операции с переменными в этой области.

Как и таблицы, функции, присвоенные другим переменным или переданные в качестве аргумента другим функциям, остаются тем же самым "объектом функции", который вызывается и по исходной ссылке.

Результат при преобразовании к строке "function".

Неподдерживаемые типы

 * Тип   используется для хранения "тёмных" значений для расширений Lua, написанных на других языках; например, userdata может содержать указатель или структуру языка C. Для возможности использования Scribunto в средах, где специально скомпилированный код не разрешён, такие расширения там не используются.


 * Тип   представляет дескрипторы сопроцессов, в песочнице Scribunto не доступных.

Метатаблицы
С любой таблицей может быть ассоциирована специальная таблица — метатаблица. Поля метатаблицы используются некоторыми операторами и функциями, чтобы указать для таблицы в них иное или резервное поведение. К метатаблице таблицы можно обращаться с помощью функции, а устанавливается она функцией.

Изнутри метафункций доступ к полям метатаблиц осуществляется как при помощи.

Следующие метаполя влияют на работу с самой таблицей:
 * __index : Используется, когда обращение к  должно бы было возвратить nil. Если значение этого поля — таблица, доступ будет переадресован в эту таблицу, т. е.   (что может привести к вызову __index метатаблицы этой таблицы). Если значение поля — функция, она будет вызвана в форме  . Функция   обходит этот метаметод.
 * __newindex : Используется при присвоении ключа таблицы  в том случае, когда   возвратил бы nil. Если значение этого поля — таблица, присваивание перенаправится в эту таблицу, т. е.   (что может привести к вызову __newindex метатаблицы данной таблицы). Если значение этого поля — функция, она будет вызвана в виде  . Функция rawset обходит этот метаметод.
 * __call : Используется, когда к таблице применяется синтаксис вызова функции: . Значение должно быть функцией, которая будет вызываться наподобие.
 * __mode : Используется для хранения в таблице слабых ссылок. Значение должно быть строкой. По умолчанию, любое значение, используемое в таблице как ключ или как значение поля, не будет вычищено из памяти в процессе работы модуля. Но если в данном метаполе есть буква 'k', ключи могут выбрасываться, если на них нет неслабых ссылок, а если есть 'v', то значения; в обоих случаях убираются и ключ, и соответствующее значение. Заметьте, что это поведение становится неопределённым, если данное поле изменено после того, как метатаблица сопоставлена таблице.

В числе других полей метатаблиц: * В бинарных операторах Lua, определяя, какой метаметод использовать, сначала рассматривает метатаблицу левого аргумента, если она есть, а потом правого. ** В операторах сравнения метаметод используется только в том случае, если одна и та же функция определена для обоих аргументов. Разные анонимные функции, даже если их код одинаков, не считаются тождественными. *** __metatable влияет на getmetatable и на setmetatable
 * __add*
 * __sub*
 * __mul*
 * __div*
 * __mod*
 * __pow*
 * __unm
 * __concat*
 * __eq**
 * __lt**
 * __le**
 * __pairs
 * __ipairs
 * __metatable***
 * __tostring

Замечание: в Lua все строки снабжены единой общей метатаблицей, в которой __index ссылается на таблицу. В Scribunto эта метатаблица недоступна, как и сама таблица ; таблица string, доступная модулям, — это копия.

Переменные
Переменные — это места, в которых хранятся значения. В Lua есть три разновидности переменных: глобальные переменные, локальные переменные и поля таблиц.

Идентификатор представляет глобальную или локальную переменную (или аргумент функции, являющийся вариантом локальной переменной). Переменные считаются глобальными, пока явно не объявлены с использованием ключевого слова. Любая переменная, которой не было присвоено значение, считается содержащей nil.

Глобальные переменные хранятся в стандартной таблице Lua, называемой средой; эта таблица часто доступна в виде глобальной переменной. К этой таблице глобальных переменных допускается объявлять метатаблицу; метаметоды __index и __newindex будут вызываться для чтения и присваивания значений глобальных переменных, как они бы работали для доступа к полям любой таблицы.

К среде некоторой функции можно обращаться с помощью функции getfenv и изменять её с помощью setfenv; в Scribunto эти функции жёстко ограничены, если вообще доступны. Локальные переменные имеют локальную область видимости, см. подробнее Объявление локальных переменных.

Выражения
Выражение — это что-то, возвращающее значения: литералы (числа, строки,,  ,  ), объявления анонимных функций, конструкторы таблиц, ссылки на переменные, вызовы функций, выражения  , выражения в круглых скобках, унарные операторы, применённые к выражениям, и выражения, объединённые бинарным оператором. Большинство выражений имеет одно значение; вызовы функций и выражения vararg могут иметь любое количество значений. Заметьте, что оборачивание вызова функции или vararg'а в круглые скобки приведёт к потере всех значений, кроме первого.

Списки выражений — это последовательности выражений, разделённых запятыми. Все выражения, кроме последнего, приводятся к единому значению (отбрасыванием дополнительных значений или, если значений у выражения нет совсем, подстановкой nil); из последнего выражения берутся все значения и присоединяются к списку.

Арифметические операторы
В Lua поддерживаются обычные арифметические действия: сложение, вычитание, умножение, деление, нахождение остатка, возведение в степень и смена знака.

Когда все операнды — числа либо строки, для которых tonumber возвращает не nil, смысл операций обычный.

Если среди операндов есть таблица с подходящим метаметодом, будет вызван этот метаметод.

Операторы сравнения
Операторы сравнения в Lua такие:,  ,  ,  ,   и. Результаты операторов сравнения — всегда логические значения.

Равенство сперва сравнивает типы операндов; если они отличаются, результат отрицательный. Если же они совпадают, сравниваются значения: nil, логические, числа и строки сравниваются ожидаемым образом. Функции равны, если ссылаются на один и тот же функциональный объект;  возвратит , поскольку в нём сравниваются две различных анонимных функции. Точно так же по умолчанию сравниваются таблицы, но метаметод __eq, прописанный в обеих сравниваемых таблицах, может изменить это поведение.

Неравенство — это строго логическое отрицание равенства.

В операторах ранжирования аргументы сравниваются напрямую, если оба они числа или оба строки. Иначе проверяются метаметоды: Если нужных метаметодов нет, возникает ошибка.
 * →, если определён, иначе, если есть  , он считается эквивалентным
 * считается эквивалентным
 * считается эквивалентным
 * считается эквивалентным

Логические операторы
Логические операторы Lua — это  („и“),   („или“) и   („не“). Все они интерпретируются стандартно при том, что nil и false считаются ложью, а всё остальное — истиной.

В, если левый операнд ложный, то он возвращается, а второй операнд не вычисляется; иначе возвращается второй операнд.

В, если левый операнд истинен, то он возвращается, а второй операнд не вычисляется; иначе возвращается второй операнд.

Результат  всегда   либо.

Заметьте, что  и   сокращают выполнение, когда возможно. Например,  выполнит только   и не будет выполнять , если   вернёт первым значением false или nil.

Оператор конкатенации
Оператор конкатенации — это две точки:. Если оба операнда числа или строки, они будут преобразованы в строки и составлены вместе. Иначе, если доступен метаметод __concat, применяется он, а если нет, возникает ошибка.

Заметьте, что строки Lua неизменяемы и в Lua нет никакого "строителя строк", таким образом, цикл, вновь и вновь выполняющий, будет на каждом этапе создавать новую строку и, как результат, отправлять на очистку из памяти старую строку. Если надо сложить множество строк, может быть быстрее применить string.format или вставить все строки в и применить в конце table.concat.

Оператор длины
Оператор длины выглядит как  и применяется в виде. Если  — строка, возвращается длина в байтах. Если  — таблица-последовательность, возвращается длина последовательности.

Если  — таблица, но не последовательность,   может возвратить любое N такое, что a[N] — не nil и a[N+1] равно nil, даже если при более высоких индексах есть непустые значения. Например:

Приоритет операторов
Приоритет операторов Lua, от высшего к низшему:


 * not # - (знаковый)
 * + - (вычитание)
 * and
 * or
 * and
 * or
 * and
 * or

На одном уровне приоритета большинство операторов ассоциативны слева, т. е.  вычисляется как. Возведение в степень и конкатенация ассоциативны вправо, т. е.  интерпретируется как.

Вызовы функций
Вызовы функций в Lua выглядят так же, как и в большинстве других языков: за именем следует список аргументов в скобках.

func( exp-list )

Как и в других списках выражений Lua, последнее выражение списка может возвратить несколько значений.

Если функция вызвана с меньшим числом аргументов, чем было указано в её объявлении, недостающие аргументы будут иметь значение nil. Если в списке значений больше, чем параметров в определении, лишние будут отброшены. Функция также может принимать переменное количество аргументов, подробнее см. Объявления функций.

Lua позволяет непосредственный вызов значения, возвращаемого функцией, вида. Если выражение, более сложное, чем обращение к переменной, должно определить функцию, которую надо вызвать, то вместо обращения к переменной помещается это выражение в круглых скобках.

В Lua есть синтаксический сахар для двух распространённых случаев. Во-первых, если таблицу используют как объект, а функцию из таблицы — как метод, возможен синтаксис

table:name( exp-list )

— в точности эквивалентный

table.name( table, exp-list )

Во-вторых, в Lua есть метод реализации именованных аргументов путём передачи таблицы, содержащей пары имя=значение, в качестве единственного позиционного аргумента функции. В этом случае скобки вокруг списка аргументов можно опустить. Это верно и тогда, когда единственный аргумент — строковая константа. Например,

func{ arg1 = exp, arg2 = exp } func"string"

эквивалентны

func( { arg1 = exp, arg2 = exp } ) func( "string" )

Как объединение этих приёмов, следующие вызовы эквивалентны:

table:name{ arg1 = exp, arg2 = exp } table.name( table, { arg1 = exp, arg2 = exp } )

Объявления функций
Синтаксис объявления и определения функций такой:

function ( список переменных ) блок end

Все переменные в  локальны для функции; значения присваиваются им из списка выражений при вызове функции. Дополнительные локальные переменные можно задать в блоке.

Когда функция вызывается, операторы в е выполнеяются после того, как создаются и заполняются значениями локальные переменные из. Если достигается выражение, выполняется выход из блока, и значениями выражения вызова функции становятся те, которые переданы в. Если выполнение достигает конца блока функции и  не встречается, возвращается ноль значений.

Функции Lua — лексические замыкания. Обычной практикой является создание "private static"-переменных как локальных для области, где функция объявлена. Например,

Можно объявить функцию с переменным числом параметров, указав  как последний элемент списка переменных:

function ( список переменных, ... ) блок end

Внутри блока может использоваться выражение varargs, его значениями будут все дополнительные значения, переданные при вызове функции. Например,

Функция select предназначена для работы с выражениями varargs; как правило,  следует использовать вместо *  для получения числа значений в этом выражении.

В Lua есть синтаксический сахар для объединения объявления функции и её присвоения переменной, см. Операторы объявления функций.

Внимание, это работать не будет:  local factorial = function ( n ) if n <= 2 then return n   else return n * factorial( n - 1 ) end end Поскольку объявление функции осуществляется до того, как завершено присваивание значения локальной переменной,  внутри функции ссылается на глобальную переменную с таким именем (вероятно, не определённую). Такой проблемы можно избежать, если сперва объявить локальную переменную, а присвоить ей функцию уже в следующем операторе.

Операторы
Оператор (в смысле предложение) — это основная единица выполнения: одно присваивание, управляющая конструкция, вызов функции, объявление переменной и т. п.

Кусок (chunk) — это последовательность операторов, разделённых необязательными точками с запятой. Кусок в основном рассматривается как тело анонимной функции; таким образом, он может определять локальные переменные, принимать аргументыи возвращать значение.

Блок — так же, как и кусок, последовательность операторов. Блок можно ограничить и сделать единым оператором:. Таким образом можно ограничить область видимости локальных переменных, или поместить  или   в середине другого блока.

Присваивание
Здесь  — ряд переменных через запятую, а , как обычно, ряд из одного или более выражения, разделённый запятыми. Все выражения вычисляются до того, как какая-либо часть присваивания будет выполнена, так что оператор  поменяет местами значения   и.

Объявление локальных переменных
Локальные переменные можно объявить где угодно внутри блока. Первая форма, без списка выражений, объявляет переменные, но не присваивает им значений, так что все они получают значение nil.Вторая форма задаёт локальным переменным значения, как описано выше.

Имейте в виду, что видимость локальной переменной начинается с оператора, следующего за объявлением. ТАким образом, объявление вида  объявляет локальную переменную   и присваивает ей значение переменной   из внешней области видимости. Локальная переменная видима до завершения самого глубоко вложенного блока, содержащего её объявление.

Управляющие конструкции
Оператор  повторяет , покуда   возвращает истину.

Оператор  повторяет   до тех пор, пока   не возвратит истину. Локальные переменные блока доступны и из выражения.

Первая форма цикла  объявляет локальную переменную и выполняет блок при её значениях от НачЗн до КонЗн, прибавляя Шг на каждой итерации. Шг можно опустить, по умолчанию равен 1. Все выражения между  и   вычисляются один раз перед запуском цикла.

Эта форма оператора  примерно эквивалентна

кроме того, что переменные,   и   не доступны для другого использования. Заметьте, что переменная  локальна для  а; чтобы её использовать после окончания цикла, её надо скопировать в переменную, объявленную вне него.

The second form of the for loop works with iterator functions. As in the first form, the exp-list is evaluated only once before beginning the loop.

This form of the for loop is roughly equivalent to

do    local func, static, var = exp-list while true do        local var-list = func( static, var ) var = var1 -- var1 is the first variable in var-list if var == nil then break end block end end

except that again the variables func, static, and var are not accessible anywhere else. Note that the variables in var-list are local to the block; to use them after the loop, they must be copied to variables declared outside the loop.

Often the exp-list is a single function call that returns the three values. If the iterator function can be written so it only depends on the parameters passed into it, that would be the most efficient. If not, Programming in Lua suggests that a closure be preferred to returning a table as the static variable and updating its members on each iteration.

Executes block1 if exp1 returns true, otherwise executes block2 if exp2 returns true, and block3 otherwise. The  portion may be omitted, and the   portion may be repeated or omitted as necessary.

The return statement is used to return values from a function or a chunk (which is just a function). The expression-list is a comma-separated list of zero or more expressions.

Lua implements tail calls: if expression-list consists of exactly one expression which is a function call, the current stack frame will be reused for the call to that function. This has implication for functions that deal with the call stack, such as  and.

The return statement must be the last statement in its block. If for some reason a return is needed in the middle of a block, an explicit block  may be used.

The break statement is used to terminate the execution of a while, repeat, or for loop, skipping to the next statement after the loop.

The break statement must be the last statement in its block. If for some reason a break is needed in the middle of a block, an explicit block  may be used.

Вызов функции как оператор
A function call may be used as a statement; in this case, the function is being called only for any side effects it may have (e.g. mw.log logs values) and any return values are discarded.

Операторы объявления функций
Lua provides syntactic sugar to make declaring a function and assigning it to a variable more natural. The following pairs of declaraions are equivalent

-- Basic declaration function func( var-list ) block end func = function ( var-list ) block end

-- Local function local function func( var-list ) block end local func; func = function ( var-list ) block end

-- Function as a field in a table function table.func( var-list ) block end table.func = function ( var-list ) block end

-- Function as a method in a table function table:func( var-list ) block end table.func = function ( self, var-list ) block end

Note the colon notation here parallels the colon notation for function calls, adding an implicit argument named "self" at the beginning of the arguments list.

Error handling
Errors may be "thrown" using the error and assert functions. To "catch" errors, use pcall or xpcall. Note that certain internal Scribunto errors cannot be caught in Lua code.

Garbage collection
Lua performs automatic memory management. This means that you have to worry neither about allocating memory for new objects nor about freeing it when the objects are no longer needed. Lua manages memory automatically by running a garbage collector from time to time to collect all dead objects (that is, objects that are no longer accessible from Lua) and objects that are only reachable via weak references. All memory used by Lua is subject to automatic management: tables, functions, strings, etc.

Garbage collection happens automatically, and cannot be configured from within Scribunto.