Lua: различия между версиями

Материал из Поле цифровой дидактики
Строка 68: Строка 68:
=== Представление внешних данных в виде таблиц и графов при помощи [[Graphviz]] ===
=== Представление внешних данных в виде таблиц и графов при помощи [[Graphviz]] ===
{{#invoke:ExtGraph|main|url=https://raw.githubusercontent.com/patarakin/stat-data/refs/heads/main/datasets/csv/digida_collab.csv|view=graph}}
{{#invoke:ExtGraph|main|url=https://raw.githubusercontent.com/patarakin/stat-data/refs/heads/main/datasets/csv/digida_collab.csv|view=graph}}
{{Lua clue}}


=== Пример 2 ===
=== Пример 2 ===

Версия от 20:13, 16 апреля 2026


Краткое описание языка 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 air smelled of fresh rain. a cat was lazily lying in the shade.

Модуль:SimpleGenerator

One day... the air smelled of fresh rain. a cat was lazily lying in the shade.

Представление внешних данных в виде таблиц и графов при помощи 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 в MediaWiki: аффордансы и решения (Scribunto + SMW)
Аффорданс / проблема Решение (фрагмент кода Lua)

1. Принять параметры из вики-страницы

Студент хочет передать аргументы в модуль через {{#invoke:}} и получить что-то назад.

local p = {}
function p.hello(frame)
  local name = frame.args.name or "мир"
  return "Привет, " .. name .. "!"
end
return p

Вызов: {{#invoke:MyModule|hello|name=Иван}}

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

Вызов: {{#invoke:MyModule|table|Lua|SMW|NetLogo}}

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

Вызов: {{#invoke:MyModule|words|title=Lua/Tutorial}}

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

Вызов: {{#invoke:MyModule|getprop|property=Дата создания}}

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

Вызов: {{#invoke:MyModule|ask}}

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

Вызов: {{#invoke:MyModule|setprop|author=Иванов|type=remix}}

7. Вызвать парсер-функцию из Lua

Нужно использовать #time, #if или другую parser function прямо внутри модуля.

local p = {}
function p.today(frame)
  local date = frame:callParserFunction(
    "#time", {"d F Y"}
  )
  return "Сегодня: " .. date
end
return p

Вызов: {{#invoke:MyModule|today}}

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

Вызов: {{#invoke:DatasetAggregator|rows|url=https://raw.githubusercontent.com/…/data.csv}}

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

Вызов: {{#invoke:MyModule|ulen|text=Привет}}

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

Вызов: {{#invoke:MyModule|bar|75}}

Пример 2

Вызов модуля, который возвращает цветные буквы текста (Латиница)
Colored text and something more

Пример 3

Модуль возвращает гистограмму численности групп
25
50
75
100
125
150
09
10
11
11
  •   Учителя
  •   Ученики
  •   Роботы

1

1 000 000
2 000 000
3 000 000
4 000 000
10 000
20 000
30 000
40 000
50 000
5000
10 000
15 000
20 000
1920
1965
2002
  •   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