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

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

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