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