7 – Автономный Lua

Хотя Lua был разработан как дополнительный язык, для встраивания в программы написанные на языке С, он зачастую используется как самостоятельный язык. Интерпретатор для Lua как автономного языка, называется просто lua и включен в стандартный пакет поставки. Автономный интерпретатор включает в себя все стандартные библиотеки, включая и библиотеку отладки. Синтаксис использования таков:
lua [options] [script [args]]
Опции (options) могут быть следующими:
-e stat : выполняет строку stat;
-l mod : "запрашивает" mod;
-i : переходит в интерактивный режим после запуска script;
-v : выводит сведения о версии;
-E : игнорирует переменные окружения;
-- : останавливает обработку опций;
- : выполняет stdin как файл и останавливает обработку опций.
После обработки своих опций, lua запускает заданный script. При вызове без аргументов, lua ведет себя как lua -v -i, когда стандартный ввод (stdin) является терминалом, и как lua - в остальных случаях.

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

При вызове с опцией -E, помимо игнорирования LUA_INIT, Lua также игнорирует значения LUA_PATH и LUA_CPATH, установку значений package.path и package.cpath с путями по умолчанию, определенными в luaconf.h.

Все опции обрабатываются по порядку, за исключением -i и -E. Например, вызов вроде
$ lua -e'a=1' -e 'print(a)' script.lua
вначале установит переменную a равной 1, затем напечатает значение a, и наконец запустит файл 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, скрипт компилируется как vararg функция, т.е. функция с переменным количеством аргументов.)

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

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

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

Чтобы разрешить использование Lua в качестве интерпретатора скриптов в системах Unix, автономный интерпретатор пропускает первую строку порции (chunk), если она начинается с символа #. Таким образом, скрипты Lua могут быть превращены в исполняемые программы при помощи chmod +x и формы #!, как в
#!/usr/local/bin/lua
(Конечно, расположение интерпретатора Lua на вашей машине может быть и другим. Если lua находится в глобальной переменной PATH, тогда
#!/usr/bin/env lua
является более портативным решением.)