Lua
| Краткое описание языка | Lua (лу́а, с порт. — «луна»— скриптовый язык программирования, разработанный в подразделении Tecgraf (Computer Graphics Technology Group) Католического университета Рио-де-Жанейро (Бразилия). Интерпретатор языка является свободно распространяемым, с открытым исходным кодом на языке программирования Си. По идеологии и реализации язык Lua ближе всего к JavaScript, в частности, он также реализует прототипную модель ООП, но отличается паскалеподобным синтаксисом и более мощными и гибкими конструкциями. Характерной особенностью Lua является реализация большого числа программных сущностей минимумом синтаксических средств. Так, все составные пользовательские типы данных (массивы, структуры, множества, очереди, списки) реализуются через механизм таблиц, а механизмы объектно-ориентированного программирования, включая множественное наследование — с использованием метатаблиц, которые также отвечают за перегрузку операций и ряд других возможностей. |
|---|---|
| Компетенции в каких сферах формирует | Computational Thinker |
| Парадигмы программирования | Функциональное программирование, Процедурное программирование |
| Возрастная категория | 16 |
| Назначение языка (Общее / Учебное) | Язык общего назначения |
| Visual_Text_Blocks | Текст |
| Измерение (2D/3D/Tangible) | 2D |
| Область знаний | |
| Открытость продукта | Открытый |
| Address | http://www.lua.org/ |
| Предки (Ancestors) | Scheme |
| Потомки (Descendants) | JavaScript, Fennel |
| Активность в данный момент | Project is active |
| Доступны ремиксы? | Да |
| Год создания | 1993 |
| Создатели | Селиш |
| Поясняющее видео | |
| Используется для создания мобильных приложений? | Да |
- Lua упоминается в свойствах следующих страниц
- How to Keep Score in a Game, How to connect Lua and C++, Learn2love, Lua/Таблица, Pathfinding, Sophie Nik, Алгоритмы и структуры данных (syllabus), Данные, Информационные системы (Syllabus), Информационные системы (Syllabus) 2025, Искусственный игровой интеллект, Как написать курсовую работу по программированию, Как проводить статистические вычисления в Lua, Как управлять поведением агентов на основании их пространственных характеристик, Мобильное приложение, Описательная статистика, Описать датасет при помощи описательной статистики, Программирование (syllabus) 2026, Программирование (математики и физики), Программирование на языках высокого уровня, Программный код, Процедурное программирование, Регулярные выражения, Рекурсия
Lua - скриптовый язык программирования используется для написания игр. Например, на Lua написан написан Foldit CoockBook, движок Roblox
Внутри MediaWiki можно использовать скрипты-модули Lua. Надо научиться их встраивать.
local function func( n )
if n == 1 then return 1
else return n * func( n - 1 )
end
end
print( func( 5 ) )
Пример использования модуля Lua
local p = {} --p stands for package
function p.wbook( frame )
return "This is en example [[Active Essays]] on [[Lua]]"
end
return p
This is en example Active Essay on Lua
Пример простейшего текстового генератора, который встраивает набор фраз в вики страницу
One day... the birds were singing melodiously. clouds started gathering on the horizon.
One day... the birds were singing melodiously. clouds started gathering on the horizon.
Представление внешних данных в виде таблиц и графов при помощи Graphviz
<graphviz> digraph G {
layout = "neato"; node [shape=none]; "A_266" -> "P_3327"; "A_268" -> "P_3327"; "A_270" -> "P_3711"; "A_278" -> "P_3711"; "A_1195" -> "P_3882"; "A_1295" -> "P_3882"; "A_411" -> "P_3968"; "A_433" -> "P_3968"; "A_433" -> "P_3972"; "A_439" -> "P_3972"; "A_414" -> "P_4037"; "A_455" -> "P_4037"; "A_435" -> "P_4044"; "A_632" -> "P_4044"; "A_469" -> "P_4173"; "A_497" -> "P_4173"; "A_361" -> "P_4179"; "A_362" -> "P_4179"; "A_415" -> "P_4444"; "A_468" -> "P_4444"; "A_415" -> "P_4471"; "A_546" -> "P_4471"; "A_415" -> "P_4474"; "A_548" -> "P_4474"; "A_412" -> "P_4476"; "A_518" -> "P_4476"; "A_550" -> "P_4476"; "A_413" -> "P_4478"; "A_565" -> "P_4478"; "A_415" -> "P_4486"; "A_555" -> "P_4486"; "A_415" -> "P_4490"; "A_563" -> "P_4490"; "A_565" -> "P_4490"; "A_569" -> "P_4490"; "A_411" -> "P_4494"; "A_559" -> "P_4494"; "A_411" -> "P_4497"; "A_564" -> "P_4497"; "A_413" -> "P_4525"; "A_553" -> "P_4525"; "A_415" -> "P_4541"; "A_621" -> "P_4541"; "A_700" -> "P_4541"; "A_471" -> "P_4586"; "A_1221" -> "P_4586"; "A_539" -> "P_4589"; "A_707" -> "P_4589"; "A_411" -> "P_4600"; "A_558" -> "P_4600"; "A_411" -> "P_4650"; "A_570" -> "P_4650"; "A_456" -> "P_4729"; "A_457" -> "P_4729"; "A_1193" -> "P_5756"; "A_1194" -> "P_5756"; "A_1197" -> "P_5756"; "A_1200" -> "P_5756"; "A_1204" -> "P_5756"; "A_2067" -> "P_5756"; "A_1172" -> "P_5945"; "A_1843" -> "P_5945"; "A_1254" -> "P_6052"; "A_1257" -> "P_6052"; "A_1258" -> "P_6052"; "A_1241" -> "P_6069"; "A_1249" -> "P_6069"; "A_1246" -> "P_6079"; "A_1412" -> "P_6079"; "A_1372" -> "P_6237"; "A_1375" -> "P_6237"; "A_1370" -> "P_6269"; "A_1376" -> "P_6269"; "A_1733" -> "P_6269"; "A_1821" -> "P_6269"; "A_1246" -> "P_6313"; "A_1247" -> "P_6313"; "A_1367" -> "P_6351"; "A_1368" -> "P_6351"; "A_1369" -> "P_6351"; "A_1370" -> "P_6351"; "A_1371" -> "P_6351"; "A_1372" -> "P_6351"; "A_1374" -> "P_6351"; "A_1375" -> "P_6351"; "A_1376" -> "P_6351"; "A_1397" -> "P_6351"; "A_1368" -> "P_6370"; "A_1371" -> "P_6370"; "A_1372" -> "P_6373"; "A_1378" -> "P_6373"; "A_1193" -> "P_6442"; "A_1194" -> "P_6442"; "A_1195" -> "P_6442"; "A_1197" -> "P_6442"; "A_1198" -> "P_6442"; "A_1199" -> "P_6442"; "A_1200" -> "P_6442"; "A_1201" -> "P_6442"; "A_1202" -> "P_6442"; "A_1204" -> "P_6442"; "A_1586" -> "P_6492"; "A_1639" -> "P_6492"; "A_1368" -> "P_6497"; "A_1371" -> "P_6497"; "A_1493" -> "P_6651"; "A_1495" -> "P_6651"; "A_1642" -> "P_6912"; "A_1643" -> "P_6912"; "A_1642" -> "P_6913"; "A_1643" -> "P_6913"; "A_1193" -> "P_7066"; "A_1194" -> "P_7066"; "A_1200" -> "P_7066"; "A_1201" -> "P_7066"; "A_1293" -> "P_7066"; "A_1201" -> "P_7164"; "A_1204" -> "P_7164"; "A_1502" -> "P_7212"; "A_1590" -> "P_7212"; "A_1198" -> "P_7507"; "A_1203" -> "P_7507"; "A_1535" -> "P_7507"; "A_1529" -> "P_7619"; "A_1670" -> "P_7619"; "A_1495" -> "P_7709"; "A_2211" -> "P_7709";
} </graphviz>
| Аффорданс / проблема | Решение (фрагмент кода Lua) |
|---|---|
|
1. Принять параметры из вики-страницы Студент хочет передать аргументы в модуль через {{#invoke:}} и получить что-то назад. |
local p = {}
function p.hello(frame)
local name = frame.args.name or "мир"
return "Привет, " .. name .. "!"
end
return p
Вызов: |
|
2. Построить wikitable из аргументов Вывести список данных в виде красивой таблицы прямо на странице. |
local p = {}
function p.table(frame)
local out = '{| class="wikitable"\n! №\n! Значение\n'
local i = 1
while frame.args[i] do
out = out .. "|-\n| " .. i .. " || " .. frame.args[i] .. "\n"
i = i + 1
end
return out .. "|}"
end
return p
Вызов: |
|
3. Прочитать содержимое wiki-страницы Нужно проанализировать текст другой страницы — посчитать слова, ссылки, заголовки. |
local p = {}
function p.words(frame)
local titleObj = mw.title.new(frame.args.title or "")
if not titleObj then return "Страница не найдена" end
local content = titleObj:getContent()
if not content then return "Нет содержимого" end
local n = 0
for _ in mw.ustring.gmatch(content, "%S+") do n = n + 1 end
return "Слов в исходном тексте: " .. n
end
return p
Вызов: |
|
4. Получить SMW-свойство страницы Нужно программно прочитать значение семантического свойства, записанного на странице. |
local p = {}
function p.getprop(frame)
if not mw.smw then return "mw.smw недоступен" end
local val = mw.smw.getPropertyValue(
frame.args.property or "Modification date"
)
if val == nil then return "(нет значения)" end
return tostring(val)
end
return p
Вызов: |
|
5. Выполнить #ask-запрос из Lua Нужно получить список страниц по SMW-запросу и обработать результаты программно. |
local p = {}
function p.ask(frame)
if not mw.smw then return "mw.smw недоступен" end
local results = mw.smw.ask("[[Категория:Модули]]|?#-=page|limit=5")
if not results then return "Нет результатов" end
local out = '{| class="wikitable"\n! Страница\n'
for _, row in ipairs(results) do
out = out .. "|-\n| " .. (row.page or "?") .. "\n"
end
return out .. "|}"
end
return p
Вызов: |
|
6. Записать SMW-свойство из Lua Нужно программно задать семантическое свойство страницы — например, при создании карточки. |
local p = {}
function p.setprop(frame)
if not mw.smw then return "mw.smw недоступен" end
local data = {
["Автор модуля"] = frame.args.author or "",
["Тип модуля"] = frame.args.type or "remix"
}
local result = mw.smw.set(data)
if result == true then
return "Свойства сохранены"
else
return "Ошибка: " .. (result.error or "неизвестная")
end
end
return p
Вызов: |
|
7. Вызвать парсер-функцию из Lua Нужно использовать |
local p = {}
function p.today(frame)
local date = frame:callParserFunction(
"#time", {"d F Y"}
)
return "Сегодня: " .. date
end
return p
Вызов: |
|
8. Загрузить внешний CSV и посчитать строки Нужно прочитать данные с GitHub или другого URL и агрегировать их. |
local p = {}
function p.rows(frame)
if not (mw.ext and mw.ext.externalData) then
return "Extension:External Data недоступен"
end
local url = frame.args.url or ""
if url == "" then return "Укажите url=" end
local data, errors = mw.ext.externalData.getExternalData{
source = url,
format = "csv with header"
}
if not data then return "Ошибка загрузки" end
return "Строк в CSV: " .. #data
end
return p
Вызов: |
|
9. Строка с Юникодом: считать буквы, не байты При подсчёте символов русского/японского текста стандартный |
local p = {}
function p.ulen(frame)
local text = frame.args.text or ""
local bytes = #text
local chars = mw.ustring.len(text)
return "Байт: " .. bytes .. " / Символов Unicode: " .. chars
end
return p
Вызов: |
|
10. Отдать HTML через mw.html Нужно сгенерировать сложный HTML-элемент (прогресс-бар, карточку) без конкатенации строк. |
local p = {}
function p.bar(frame)
local val = tonumber(frame.args[1]) or 0
val = math.max(0, math.min(100, val))
local wrap = mw.html.create("div")
:css("background", "#eee")
:css("border-radius", "4px")
:css("width", "200px")
wrap:tag("div")
:css("background", "#4caf50")
:css("width", val .. "%")
:css("padding", "3px 6px")
:css("color", "white")
:wikitext(val .. "%")
return tostring(wrap)
end
return p
Вызов: |
Пример 2
- Вызов модуля, который возвращает цветные буквы текста (Латиница)
Пример 3
- Модуль возвращает гистограмму численности групп
- Учителя
- Ученики
- Роботы
1
- People
- Cars
- Average car cost
Lua - руководства
- https://habr.com/ru/articles/738414/
- Lua — "маленький язык", с низкой когнитивной нагрузкой и простотой в изучении и использовании. Он встроен во многое ПО, такое как Redis, NGINX через OpenResty и Wireshark. Он также используется в качестве скриптового языка в таких играх, как World of Warcraft и Roblox через Luau
- https://www.mediawiki.org/wiki/Help:Lua/Lua_best_practice/ru
- Lua в MediaWiki
- https://en.wikibooks.org/wiki/Category:Book:Lua_Programming
- Вики учебник
- https://www.tutorialspoint.com/compilers/online-lua-compiler.htm
- on-line
