Необходимое программное обеспечение
Для работы со скриптами Lua нам понадобится установить редактор Microsoft Visual Studio Code (VS Code) и еще, как минимум, два расширения. Одно для русификации этого редактора, а другое для обработки скрипта на языке Lua.
Сначала необходимо установить VS Code на компьютер, следуя инструкциям программы установщика, и запустить его. После этого для установки расширений нужно щелкнуть левой кнопкой мыши на кнопке указанной стрелочкой на рисунке 1, а затем наберать в поле ввода Code Runner. Появится список расширений, из которого вам нужно выбрать отмеченное галочкой на рисунке, нажав кнопочку «Install», для его установки.

Чтобы работать в программе с меню на русском языке следует установить ещё расширение Russian Language Pack for Visual Studio Code, это расширение устанавливается также, как и предыдущее, только нужно задать в поле ввода Russian вместо Code Runner, отметить в появившемся списке Russian Language Pack for и перезапустить VS Code после установки расширения, чтобы перейти на русский язык.
Кроме этого, необходимо установить дистрибутив библиотек Lua в бинарном формате, скачав его последнюю версию по ссылке. На компьютер будет скачана папка в виде архива, в которой находятся нужные файлы. Архив нужно разархивировать в папку Lua. В папке Lua нужно переименовать файл lua55.exe в lua.exe (числа в имени файла могут быть другими — это номер версии). а затем задать путь к этой папке в переменную окружения PATH. PATH — это список каталогов, в которых операционная система (Windows, Linux, macOS) ищет исполняемые файлы.
После первого запуска программы VS Code появится кнопка «Открыть папку».

Нажав эту кнопку, нужно с помощью проводника задать рабочую папку, выбрав существующую папку или создав новую. Доверие к этой папке нужно будет подтвердить нажатием соответствующей кнопки.
Можно назначить рабочую папку и по-другому, воспользовавшись пунктом «Открыть папку» падающего меню «Файл».
Для создания программы на языке Lua нужно написать скрипт и сохранить его в рабочей папке в файл с расширением lua .
Основы языка
Разные объекты, обрабатываемая в программе обозначаются строкой из латинских букв и цифр, причем первая всегда цифра. Эта строка называется идентификатором. В Lua учитывается регистр букв, поэтому Les и les - это различные идентификаторы. Некоторые слова зарезервированы, из нельзя использовать в качестве идентификаторов: and, end, if, or, until, break, false, in, do, goto, local, else, for, nil, elseif, function, not, repeat, return, then, true, while.a,b,c=1,"Текст", false равносильно a=1 b="Текст" c=false
Можно поменять значения переменных a и b, если написать a, b=b, a
Пример:
a=16
b=2
a, b=b, a
print("Ответ а=",a, ” b=”,b)
Если в строке программы перед текстом стоит два тире, то текст в этой строке программы пропускается интерпретатором или компилятором, этот текст является комментарием - это информация необходимая только программисту. Если комментарий занимает несколько строк, то в его начале должны стоять
--[[, а в конце ]]
Пример с комментарием будет выглядеть так:
a=16 -- в ячейку памяти, обозначенную идентификатором a положить число 16
b=2 -- в ячейку памяти, обозначенную идентификатором b положить число 2
a, b=b, a
--[[ Далее с помощью функции print выводим на экран строку "Ответ a=", потом значение идентификатора a, далее " b=" , а потом содержимое ячейки памяти, обозначенной идентификатором b (Значениен переменной b).
На экране будет написано Ответ a=2 b=16
]]
print("Ответ а=",a, ” b=”,b) -- print - специальная функция, которая выводит на экран значения -- своих параметров.
Типы объектов
В Lua существует восемь базовых типов объектов:Lua — язык с динамической типизацией, т.е. заранее нет необходимости указывать тип идентификатора объекта, он будет определен со время задания его значения.
Например:
а="Привет, Вася " -- string (строка)
b='Привет, Коля' -- string (строка)
n=123 -- number (число)
print(type("Привет")) -- string
print(type(10.4*3)) -- number
print(type(print)) -- function
print(type(type)) -- function
print(type(true)) -- boolean
print(type(nil)) -- nil
print(type(type(X))) -- string
Числа (number)
Lua поддерживает стандартные арифметические операции:
'+' (сложение),
'-' (вычитание),
'*' (умножение),
'/' (деление),
'^' (возведение в степень),
'%' (остаток от деления),
'-' (изменение знака числа).
Все они работают с вещественными числами.
Lua не нужен разделитель между идущими подряд операторами, они разделяются пробелом или переходом на другую строку, но можно писать для разделения точку с запятой.
Можно написать в одной строке много операторов:
a=5 b=2 c=a+b; d=a-b n=a^b; c=n/c print(a,b,c,d,n)
Математические функции собраны в таблице math.
Для вызова функций используется запись вида: math.имя_функции(...).
math.abs(x)
Число пи в таблице math - math.piBoolean (логический тип).
Данный тип переменной имеет только 2 значения: истина (true) и ложь (false)Операторы сравнения:
== (равно);
~= (не равно) вместо привычного многим !=;
> (больше);
< (меньше);
>= (больше или равно);
<= (меньше или равно).
Пример:
a=1 b=2
c=a==b -- c получает значение false
d=a~=b -- d получает значение true
print(1 and 3) -- 3
print(nil and 2) -- nil
print(false and 1) -- false
print(3 or 5) -- 3
print(false or 2) -- 2
Строки
Строки можно писать в одинарных и двойных кавычках.
Например, s1="Привет, Коля" s2=’Петя’Операции со строками: объединение строк .. (две точки), длина строки # .
Пример:
s1="Привет, "
s2="Петя"
s=s1..s2
print("Длина строки=", #s) -- Будет выведено: Длина строки=12 (учитывается пробел в s1)
Функции для работы со строками находятся в таблице string.
Функция для превращения строки s в число n (если это возможно):
Для ввода значения переменной а используется функция a=io.read() из таблицы ввода-вывода io.
Рассмотрим программу, которая вычисляет сумму введенных пользователем чисел.
a=io.read()
b=io.read()
c=a+b
print("Сумма=", c)
Таблицы.
Тип table представляет собой множество пар "Ключ", "Значение". Ключами могут быть различные значения языка кроме nil. По ключу в таблице находится значение. Таблица создается при помощи выражения-конструктора, которое в своей простейшей форме записывается как {}:
a={} -- это будет пустая таблица.
b={[3]="aa", ["bb"]=5} -- таблица с двумя ключами число 3 и строка "bb", которым соответствуют два значения строка "aa" и число 5.
Можно сначала создать пустую таблицу, а затем заполнять её. Если ключ - число, то вариант заполнения один, если строка - то два.
a={}
a[3]=5 -- ключ 3, значение 5
a.kot=7 -- ключ "kot", значение 7
a["slon"]=8 -- ключ "slon", значение 8
Например: a={"Вася","Петя","Витя"}, то ключи задаются программой целыми числами, начиная с 1.
Такие таблицы принято называть массивами.
При выводе a[3] будет написано "Витя".
В качестве значений в таблицах могут быть и различные функции.
Условные операторы.
Синтаксис условных операторов может быть трех видов:
1) Простой:
if <условие> then
<код>
end
Пример:
a=100
c=io.read()
c=tonumber (c)
if(c>a) then
a=c
end
print(a)
2) Более сложный:
if <условие> then
<код 1>
else
<код 2>
end
Пример:
a=100
b=30
c=io.read()
c=tonumber (c)
if(c>10) then
d=a+b
else
d=a-b
end
print(d)
3) Когда требуется сделать проверку сразу нескольких условий, то используется вариант:
if <условие> then
<код 1>
elseif
<код 2>
elseif
<код 3>
else
<код 4>
end
Пример:
a=io.read()
operator=io.read()
b=io.read()
if (operator == "+") then r = a + b;
elseif (operator == "-") then r = a - b;
elseif (operator == "*") then r = a*b;
elseif (operator == "/") then r = a/b;
else
print("Неверный оператор");
end
print(r)
В условиях можно использовать скобки.
Приоритет в условии отдается содержимому скобок. Если есть вложенные скобки, то начинают самых вложенных скобок.
Пример: В выражении not (a and (b or c)) сначала находится значение b or c, затем к результату и переменной a применяется логическая операция and, а потом операция not.
Пример:
a=io.read()
b=io.read()
c=io.read()
if (a>b and a<c) then print('a между b и c') end
if b<c and (a<b or a>c) then print('a вне отрезка [b, c] ') end
Циклы
Оператор for имеет следующий вид:
for i = n, k, sh do
-- тело цикла
end
Цикл начинается со значения i=n и повторяется пока i<=k с шагом sh. Шаг sh (и запятую перед ним) можно не задавать, тогда шаг будет равен 1.
Пример:
s=0
for i=1, 100, 2 do
s=s+i
end
print("Сумма нечетных чисел в интервале от 1 до 100 равна", s)
Пример создания массива (частный случай таблицы), значения которого - четные числа из интервала от 1 до 100:
w={}
for i=1, 50 do
w[i]=i*2
end
Переменная i по завершению цикла не определена. Цикл можно прервать оператором break.
Пример:
a = {3, 5, 8, -6, 5}
for i = 1,#a do -- Ищем в массиве номер отрицательного значения. #a - длина массива a.
if a[i] < 0 then -- если найдено
index = i -- сохраняем индекс найденного значения...
break -- и прерываем цикл
end
end
Обход таблицы tab
for key, val in pairs(tab) do
print ("key == "..key.."; val == "..val) – выводится пара ключ-значение
end
Цикл c предусловием while имеет следующий вид:
while <условие> do
… -- тело цикла
end
Сначала проверяется условие, а потом выполняется или нет тело цикла. Легко запустить никогда не заканчивающийся цикл, если условие будет все время выполняться.
Вычислим факториал числа, вводимого пользователем.
n=io.read()
n=tonumber (n)
fact=1
while n>1 do
fact=fact*n
n=n-1
end
if (n=>0) then print("Факториал числа ", n, "равен", fact)
else print("Факториал отрицательного числа мы не вычисляем ")
end
Цикл можно прервать оператором break.
Пример вычисления суммы целых чисел от 1 до 100 с помощью прерывания бесконечного цикла:
i=1
s=0
while true do
if (i>100) then break end
s=s+i
i=i+1
end
print("Сумма чисел от 1 до 100 равна "..s)
Цикл с постусловием repeat имеет вид:
repeat
… -- тело цикла
until <условие>
Выполняется тело цикла, а потом проверяется условие, если оно выполнено, то вновь выполняется тело цикла. Легко запустить никогда не заканчивающийся цикл, если условие будет все время выполняться. Цикл можно прервать оператором break.
Пример вычисления суммы целых чисел от 1 до 100:
i = 0; sum = 0
repeat
i = i + 1
sum = sum + i
until sum > 100
i=i-1
print ("До превышения 100 сложено "..i.." элементов.")
Функции
Функция имеет вид
function имя функции (аргумент1,аргумент2)
-- тело функции
return <возвращаемое функцией значение>
end
Список аргументов может иметь любое число аргументов, а может быть пустым
Пример 1:
function f(x,y) -- создаем функцию,
t=(x+y)^2
return t
end
s=f(2,3) -- вызываем фцнкцию
print(s) -- выведет 25
s=f(1,-5)
print(s) -- выведет 16
Пример 2:
function proc(old,new)
print("Было "..old.." стало "..new)
if new>old then
pr=((new-old)/old)*100;
pr=math.ceil(pr)
print("Увеличение на "..pr.." процентов")
elseif new<old then
pr=((old-new)/old)*100;
pr=math.floor(pr)
print("Уменьшение на "..pr.." процентов")
else
print ("Ничего не изменилось")
end
end
proc (100, 123.4) -- Выведет: Было 100 стало 123.4
-- Увеличение на 24 процентов
proc (100, 84.4) -- Выведет: Было 100 стало 84.4
-- Уменьшение на 15 процентов
proc(22.3,22.3) -- Выведет: Ничего не изменилось