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
является более портативным решением.)