Главная страница
Навигация по странице:

  • "newindex"

  • енгш. 4 неделя (НОЯБРЬ). Httpslua org rucontents ru html Lua представляет собой язык с неявным


    Скачать 30.36 Kb.
    НазваниеHttpslua org rucontents ru html Lua представляет собой язык с неявным
    Дата21.01.2022
    Размер30.36 Kb.
    Формат файлаodt
    Имя файла4 неделя (НОЯБРЬ).odt
    ТипДокументы
    #338144


    https://lua.org.ru/contents_ru.html

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

    В Lua восемь основных типов:

    • nil (неопределенный)

    • boolean (логический)

    • number (числовой)

    • string (строковый)

    • function (функция)

    • userdata (пользовательские данные)

    • thread (поток)

    • table (таблица)


    Синтаксис Lua в основном построен на основе поздних паскалеподобных языков, таких как Модула-2 или Оберон. Формат записи текста — свободный, команды в тексте программы разделяются любыми пробельными символами. Допускается, но не является обязательным применение точки с запятой для разделения операций.

    В одном из интервью Роберту Иерузалимски заметил, что синтаксис Lua — это компромиссное решение, которое он был вынужден принять, чтобы упростить освоение языка непрофессиональными программистами. Он охарактеризовал этот синтаксис как «довольно многословный», отметив, что лично для себя предпочёл бы более краткую нотацию[11].

    Лексика[править | править код]


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

    Язык регистро-зависимый, все ключевые слова пишутся в нижнем регистре, идентификаторы, отличающиеся только регистром букв, считаются различными. Следующие 22 ключевых слова не могут быть использованы для имён[15]:

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

    • "add": + операция. Если любой операнд при сложении не число (и не строка, которую можно преобразовать в число), Lua попробует вызвать метаметод. Сначала, Lua проверит первый операнд (даже если он правильный). Если этот операнд не определяет метаметод для события "__add", Lua проверит второй операнд. Если Lua найдет метаметод, он будет вызван с двумя операндами в качестве аргументов, и результат вызова (скорректированный до одного значения) будет результатом операции. Иначе будет сгенерирована ошибка.

    • "sub": - операция (вычитание). Аналогично операции "add".

    • "mul": * операция (умножение). Аналогично операции "add".

    • "div": / операция (деление). Аналогично операции "add".

    • "mod": % операция (остаток от деления). Аналогично операции "add".

    • "pow": ^ операция (возведение в степень). Аналогично операции "add".

    • "unm": - операция (одноместный минус). Аналогично операции "add".

    • "idiv": // операция (целочисленное деление). Аналогично операции "add".

    • "band": & операция (битовое И). Аналогично операции "add", за исключением того, что Lua будет использовать метаметод, если любой из операндов не целое и не значение приводимое к целому (см. §3.4.3).

    • "bor": | операция (битовое ИЛИ). Аналогично операции "band".

    • "bxor":  операция (битовое ИЛИ-НЕ). Аналогично операции "band".

    • "bnot":  операция (битовое одноместное НЕ). Аналогично операции "band".

    • "shl": << операция (битовый сдвиг влево). Аналогично операции "band".

    • "shr": >> операция (битовый сдвиг вправо). Аналогично операции "band".

    • "concat": .. операция (конкатенация). Аналогично операции "add", за исключением того, что Lua будет использовать метаметод, если любой из операндов не строка и не число (которое всегда приводимо к строке).

    • "len": # операция (длина). Если объект не строка, Lua попытается использовать этот метаметод; Если метаметод определен, он будет вызван с объектом в качестве аргумента, и результат вызова (обрезанный до одного значения) будет использован как результат операции. Если метаметод не определен и объект таблица, Lua использует операцию длины таблицы (см. §3.4.7). Иначе, Lua сгенерирует ошибку.

    • "eq": == операция (равенство). Аналогично операции "add", за исключением того, что Lua будет использовать метаметод, только если оба сравниваемых значения таблицы или полные пользовательские данные и они не примитивно равны. Результат вызова всегда преобразуется к логическому (boolean).

    • "lt": < операция (меньше). Аналогично операции "add", за исключением того, что Lua будет использовать метаметод, только если оба сравниваемых значения не числа и не строки. Результат вызова всегда преобразуется к логическому (boolean).

    • "le": <= операция (меньше или равно). В отличие от других операций, операция "<=" может использовать два разных события. Первое, Lua проверяет наличие метаметода "__le" в обоих операндах, также как в операции "lt". Если этот метаметод не найден, Lua попытается использовать событие "__lt", предполагая, что a <= b эквивалентно not (b < a). Как и у других операторов сравнения, результат всегда логическое значение. (Это использование события "__lt" может быть убрано в следующих версиях, т.к. оно медленнее, чем реальный вызов метаметода "__le".)

    • "index": индексированный доступ table[key]. Это событие случается когда table не таблица или когда key не существует в table. Метаметод ищется в объекте table.

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

    • "newindex": индексированное присваивание table[key] = value. Как и событие "index", это событие случается когда table не таблица или когда key не существует в table. Метаметод ищется в объекте table.

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

      Всякий раз, когда срабатывает метаметод "newindex", Lua не выполняет примитивное присваивание. (Если необходимо, метаметод может самостоятельно вызвать rawset для выполнения присваивания.)

    • "call": операция вызова func(args). Это событие случается когда Lua пытается вызвать значение, не являющееся функцией (т.е., func это не функция). Метаметод ищется в объекте func. Если он существует, то он вызывается с func в качестве первого аргумента, следом идут остальные аргументы из оригинального вызова (args).

    Хорошая практика, добавлять все необходимые метаметоды в таблицу перед тем, как назначить её метатаблицей какого-то объекта. В частности, метаметод "__gc" работает только если была соблюдена эта последовательность (см. §2.5.1).

    Lua - это язык свободной формы. Он игнорирует пробелы (включая переходы на новую строку) и комментарии между лексическими элементами, кроме разделителей между именами и ключевыми словами.

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

    Следующие ключевые слова зарезервированы и не могут использоваться как имена:

    and break do else elseif end false for function goto if in local nil not or repeat return then true until while

    Язык Lua чувствителен к регистру символов: and - зарезервированное слово, но And и AND - два разных, допустимых имени. Как соглашение, программы должны избегать создания имен, которые начинаются с подчеркивания и следующими за ним одной или несколькими прописными буквами (например, _VERSION).

    Следующие строки разделяют другие лексемы:

    + - * / % ^ # & | << >> // == = <= >= < > = ( ) { } [ ] :: ; : , . .. ...


    написать администратору сайта