]]> ]]>
Править | Обсудить | История

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

IDE/Редакторы:

Примеры:

Факториал:

Пример для версий 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.0
print("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

]]>

Работа программистам