Lua
- Дата создания:
- 1993
- Создан под влиянием:
- Повлиял на:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .lua
- Реализации и версии (свернуть все | развернуть все):
Lua (от португальского “луна”) — облегченный скриптовый язык c расширяемой семантикой.
Lua был создан и поддерживается представителями Pontifical Catholic University Рио-де-Жанейро. У него нет официального стандарта, и стандартом считается описание в руководстве пользователя.
В настоящее время Lua является самым популярным скриптовым языком в индустрии игр и используется в ряде приложений в других предметных областях.
Lua является сравнительно новым языком и позаимствовал черты и идеи из ряда более старых языков:
- синтаксис структур управления логикой программы — из Modula;
- семантику более поздних версий — из Scheme;
- концепцию локальных переменных — из C++;
- концепцию наличия единственной встроенной структуры данных, используемой несколькими способами — из Lisp;
- использование ассоциативных массивов — из SNOBOL;
- множественные присвоения и возвраты из функций — из CLU etc.
Основополагающим принципом Lua является расширяемость семантики, т.е. предоставление мета-механизмов для реализации переменного набора инструментов вместо предоставления фиксированного набора инструментов. Это позволяет языку быть небольшим и простым, в то же время сохраняя мощность. Таким образом, Lua можно считать мультипарадигменным языком, поскольку он позволяет вести разработку в различных стилях.
Lua поддерживает логические, числовые (по умолчанию — числа с плавающей точкой двойной точности) и строковые атомарные типы данных. Единственным “родным” сложным типом данных является таблица — гетерогенный ассоциативный массив, позволяющий использовать разные типы данных для разных пар ключей и значений. Функции являются объектами первого класса, т.е. ими можно манипулировать точно так же, как переменными, передавать и получать как аргументы и т.д.
Эти два основные свойства позволяют реализовывать многие структуры данных и принципы, доступные в других языках, при помощи использования разных типов данных для ключей и значений ассоциативного массива:
- структуры: используем строки (~ имена полей) как ключи и атомы любых нужных типов (~ значения полей) как значения; для этого случая Lua предоставляет специальный синтаксис, позволяющий обращаться к значениям полей по имени поля.
- массивы: используем целые числа (~ индексы) как ключи и атомы одного нужного типа (~ элементы массива) как значения.
- множества: элементы множества можно хранить либо как ключи, либо как значения;
- ассоциативные массивы: очевидно;
- пространства имен: таблица может использоваться для хранения функций и переменных, относящихся к определенной предметной области;
- прототипы: Lua поддерживает объектно-ориентированную парадигму, позвояля хранить функции и данные, описывающие один объект, в одной таблице. Это именно прототипы, а не классы, т.к. новые объекты создаются клонированием существующих или использованием методов фабрики объектов.
Lua компилируется в байт-код, исполняемый на виртуальной машине Lua. Lua — скриптовый язык, созданный для встраивания в другие языки, поэтому предоставляет C API.
Элементы синтаксиса:
Комментарий до конца строки | -- |
---|---|
Комментарии, которые могут быть вложенными | --[[ ... ]] |
Регистрозависимость | да |
Присваивание значения переменной | = |
Группировка выражений | ( ... ) |
Блок | do ... end |
Равенство | == |
Неравенство | ~= |
Сравнение | < > <= >= |
Определение функции | function f(p1, p2) ... end |
Вызов функции | f(a, b, ...) |
Вызов функции без параметров | f() |
Последовательность | ; или конец строки |
Если - то | if condition then ... end |
Если - то - иначе | if condition then ... else ... end |
Цикл с предусловием | WHILE condition DO ... end |
Цикл с постусловием | repeat ... until condition |
Цикл for - next для диапазона целых чисел с инкрементом на 1 | for i = 1, 10 do ... end |
Цикл for - next для диапазона целых чисел с декрементом на 1 | for i = 10, 1, -1 do ... end |
Логотип Lua
Ссылки:
Примеры:
Факториал:
Пример для версий Lua 5.0, Lua 5.1Используется рекурсивное определение факториала.
function factorial(n)
if (n == 0) then
return 1
else
return n * factorial(n - 1)
end
end
for n = 0, 16 do
io.write(n, "! = ", factorial(n), "\n")
end
Hello, World!:
Пример для версий Lua 5.0print("Hello, World!")
Числа Фибоначчи:
Пример для версий Lua 5.0Используется рекурсивное определение чисел Фибоначчи.
function fibonacci(n)
if n<3 then
return 1
else
return fibonacci(n-1) + fibonacci(n-2)
end
end
for n = 1, 16 do
io.write(fibonacci(n), ", ")
end
io.write("...\n")
Числа Фибоначчи:
Пример для версий Lua 5.0Вычисленные числа хранятся в ассоциативном массиве fib
и извлекаются из него для вычисления следующих. По умолчанию ассоциативные массивы в Lua используют целочисленные ключи, начинающиеся с 1, поэтому команда fib = {1, 1}
создает массив с индексами элементов 1 и 2.
fib = {1, 1}
for n = 3, 16 do
fib[n] = fib[n-1] + fib[n-2]
end
for n = 1, 16 do
io.write(fib[n], ", ")
end
io.write("...\n")
Квадратное уравнение:
Пример для версий Lua 5.1*n указывает на то, что читается число.
local A = io.read('*n')
if A==0 then
io.write('Not a quadratic equation.')
return
end
local B = io.read('*n')
local C = io.read('*n')
D = B*B-4*A*C
if D==0 then
io.write('x = ', -B/2/A)
else if D>0 then
io.write('x1 = ', (-B+math.sqrt(D))/2/A, '\nx2 = ', (-B-math.sqrt(D))/2/A)
else
io.write('x1 = (', -B/2/A, ',', math.sqrt(-D)/2/A, ')\nx2 = (', -B/2/A, ',', -math.sqrt(-D)/2/A, ')\n')
end
end
CamelCase:
Пример для версий Lua 5.1Создатели Lua ставили себе за цель создание максимально легкого языка, поэтому вместо полноценных регулярных выражений язык поддерживает pattern matching. Впрочем, это позволяет реализовать большинство функций регулярных выражений без лишних трудозатрат.
В данном примере первая строка читает строку для преобразования; функция io.read()
без аргумента читает строчный тип. Вторая строка изменяет регистр каждой последовательности букв к нужному; паттерн %a
соответствует букве в любом регистре, и для каждого соответствия паттерну вызывается анонимная функция, выполняющая преобразование. Третья строка убирает все последовательности не-букв, и, наконец, четвертая выводит результат на печать.
text = io.read()
text = text.gsub(text, '[%a]+', function(s)
return string.upper(string.sub(s,1,1)) .. string.lower(string.sub(s,2))
end)
text = text.gsub(text, '[%A]+', '')
io.write(text)
Комментарии
]]>blog comments powered by Disqus
]]>