7 – Автономная версия Lua

Хотя Lua была разработана как язык расширения, для встраивания в принимающую программу на C , её также часто используют как самостоятельный язык. Интерпретатор Lua как самостоятельного языка, называемый просто lua, входит в стандартную поставку. Автономный интерпретатор включает все стандартные библиотеки. Его использование:

     lua [options] [script [args]]

Параметры:

  • -e stat: выполнить строку stat;
  • -i: войти в интерактивный режим после выполнения script;
  • -l mod: "require" mod и присвоить результат глобальной переменной mod;
  • -l g=mod: "require" mod и присвоить результат глобальной переменной g;
  • -v: вывести сведения о версии;
  • -E: игнорировать переменные среды;
  • -W: включить предупреждения;
  • --: прекратить обработку параметров;
  • -: выполнить stdin как файл и прекратить обработку параметров.

Обработав свои параметры, lua выполняет заданный script. При вызове без аргументов lua ведёт себя как lua -v -i, если стандартный ввод (stdin) является терминалом, и как lua - в противном случае.

Если параметр -E не указан, интерпретатор перед выполнением любого аргумента проверяет переменную среды LUA_INIT_5_5 (или LUA_INIT, если имя с версией не определено). Если содержимое переменной имеет формат @filename, то lua выполняет файл. В противном случае lua выполняет саму строку.

Если указан параметр -E, Lua не обращается ни к каким переменным среды. В частности, значения package.path и package.cpath устанавливаются с использованием путей по умолчанию, определённых в luaconf.h. Чтобы сообщить библиотекам, что этот параметр включён, автономный интерпретатор устанавливает поле "LUA_NOENV" в реестре в истинное значение. Другие библиотеки могут проверять это поле с той же целью.

Параметры -e, -l и -W обрабатываются в порядке их появления. Например, вызов вида

     $ lua -e 'a=1' -llib1 script.lua

сначала установит a в 1, затем загрузит библиотеку lib1 и наконец выполнит файл script.lua без аргументов. (Здесь $ — приглашение оболочки. Ваше приглашение может отличаться.)

Перед выполнением любого кода lua собирает все аргументы командной строки в глобальной таблице с именем arg. Имя скрипта помещается в индекс 0, первый аргумент после имени скрипта помещается в индекс 1, и так далее. Все аргументы перед именем скрипта (то есть имя интерпретатора и его параметры) помещаются в отрицательные индексы. Например, в вызове

     $ lua -la b.lua t1 t2

таблица выглядит так:

     arg = { [-2] = "lua", [-1] = "-la",
             [0] = "b.lua",
             [1] = "t1", [2] = "t2" }

Если в вызове нет скрипта, имя интерпретатора помещается в индекс 0, за ним следуют остальные аргументы. Например, вызов

     $ lua -e "print(arg[1])"

выведет "-e". Если скрипт есть, он вызывается с аргументами arg[1], ···, arg[#arg]. Как и все чанки в Lua, скрипт компилируется как функция с переменным числом аргументов.

В интерактивном режиме Lua повторно выводит приглашение и ждёт строку. Прочитав строку, Lua сначала пытается интерпретировать её как выражение. Если это удаётся, она выводит его значение. В противном случае она интерпретирует строку как чанк. Если вы написали незавершённый чанк, интерпретатор ждёт его завершения, выводя другое приглашение.

Обратите внимание: поскольку каждая завершённая строка читается как новый чанк, локальные переменные не переживают строки. Чтобы избежать путаницы, интерпретатор выдаёт предупреждение, если строка начинается с зарезервированного слова local:

     > x = 20      -- global 'x'
     > local x = 10; print(x)
         --> warning: locals do not survive across lines in interactive mode
         --> 10
     > print(x)     -- back to global 'x'
         --> 20
     > do       -- incomplete chunk
     >> local x = 10; print(x)    -- '>>' prompts for line completion
     >> print(x)
     >> end     -- chunk completed
        --> 10
        --> 10

Если глобальная переменная _PROMPT содержит строку, то её значение используется как приглашение. Аналогично, если глобальная переменная _PROMPT2 содержит строку, её значение используется как вторичное приглашение (выводимое при незавершённых операторах).

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

При нормальном завершении интерпретатор закрывает своё основное состояние Lua (см. lua_close). Скрипт может избежать этого шага, вызвав os.exit для завершения.

Чтобы разрешить использование Lua в качестве интерпретатора скриптов в Unix-системах, Lua пропускает первую строку файлового чанка, если она начинается с #. Поэтому скрипты Lua можно превратить в исполняемые программы с помощью chmod +x и формы #!, как в

     #!/usr/local/bin/lua

Конечно, расположение интерпретатора Lua на вашей машине может быть другим. Если lua находится в вашем PATH, то

     #!/usr/bin/env lua

является более переносимым решением.