Язык Lua
Lua - мощный, эффективный, легкий, встраиваемый скриптовый язык, разработанный группой специалистов PUC-Rio, Папского католического университета Рио-де-Жанейро (Бразилия). Lua является свободным программным обеспечением, используемым во многих продуктах и проектах по всему миру.
На официальном сайте Lua можно найти полную информацию о Lua, включая краткое описание и обновленную документацию, особенно справочное руководство, которое может незначительно отличаться от локальной копии, распространяемой в данном пакете.
Что же такого особенного в языке Lua?
Lua уникален тем, что он разработан как "язык расширения", то есть может быть встроен в любую другую платформу или систему, объясняет Брендон Хаффен, инженер-программист по видеоиграм, работавший над курсом Изучение Lua. Разработчики могут использовать Lua для полной настройки продуктов, причем Lua может взаимодействовать с любым кодом на языке C. "Взять существующую функциональность чего-либо и расширить ее - это очень увлекательно, - говорит он.
Будь то создание новых игровых систем, быстрое изменение веб-сайта с добавлением специальной функции или создание уникального инструмента для повышения уровня вашей любимой художественной программы, Lua может облегчить внесение изменений практически в любую базовую систему, существующее приложение или аппаратное обеспечение (вплоть до крошечных микрочипов), говорит Брэндон. Небольшой размер, гибкость и портативность Lua делают его незаменимым для расширения всевозможных программ. Как можно не восторгаться новой классной функцией, которую вы добавили в то, что уже используете? - добавляет он.
Что можно создать с помощью Lua?
На языке Lua можно создавать игры, веб-приложения и инструменты для разработчиков. Например, приложение для мобильных платежей Venmo было создано с использованием Lua. А игра Angry Birds была создана с использованием Lua и игрового движка LÖVE. "Однако наиболее полезно изучать язык Lua тем, кто хочет добавить новую функциональность в существующую игру, сайт или приложение, для расширения которых используется код Lua, - говорит Брэндон.
По словам Брэндона, многие популярные игры и игровые платформы поддерживают использование Lua для расширения или создания новых игровых систем. Например, игровая платформа Roblox позволяет игрокам писать код на языке Lua для создания собственных оригинальных игр. В многопользовательской онлайновой ролевой игре World of Warcraft можно использовать дополнения на языке Lua (так называемые моды) для настройки игрового интерфейса.
Вы больше фотограф, чем геймер? Язык Lua также встроен в программу редактирования изображений Adobe Lightroom, что позволяет создавать собственные плагины для оптимизации рабочего процесса и упорядочивания фотографий.
Пример кода
-- NB: First run the corresponding "INIT" script as a global script, then this one per-entry.
-- TOOLS / LUA ENTRY SCRIPT (NB, run on carefully filtered subset only)
-- dj2021-04
-- If we've hit limit of how many to do, stop
if (TOTALNUMDONE>MAXTODO) then return ""; end
-- once-off loadall on first entry we process
if LOADED==0 then
tRequestLoadAll();--Make sure have loaded all entries if on ODBC
LOADED = 1;
end
-- Make sure we don't change timestamps and lastmodifiedby etc. [this is a new thing 2019-04, may change, API-unstable]
g_bAdminNoUpdateTimestamps=true;--API-unstable
-- Make sure we have a document open
local DOC = tApp():GetCurrentDoc();
if DOC == nil then
return "No document open";
end
--tRequestLoadAll();--Make sure have loaded all entries if on ODBC
local ENTRY=gCurrentEntry;
--collectgarbage(0);
collectgarbage("collect")
tRequestLoadSafe(ENTRY);
-- Find all instances of the desired element we want to modify
local aNODES=vector_tcNode__:new_local();
ENTRY:FindDescendantsOfElementType(ELEM1:GetID(),aNODES);
if (aNODES:size()>0) then
local bTHISCHANGED=false;
for k=0,aNODES:size()-1,1 do
local NODE=aNODES[k];
-- Must be simple single text child case
if (NODE:GetNumChildren()==1) and
NODE:GetChild(0):IsKindOfClass(NODE_TEXTNODE)
then
local s=tQuery(NODE,'/');
-- Check if text is any of the values we want to convert to attribute
if s=='s.nw.'
or s=='ww.'
or s=='b.nw.'
or s=='bw.'
or s=='telw.'
or s=='tw.'
or s=='vnw.'
or s=='voegw.'
or s=='voors.'
or s=='aanvangskomponent van byv. komposita'
or s=='aanvangskomponent van selfst. komposita'
or s=='aanvangskomponent van ww. komposita'
or s=='slotkomponent van selfst. komposita'
or s=='gespesialiseerde uitdr.'
or s=='idiomatiese uitdr.'
or s=='afk.'
or s=='groepvoorsetsel'
or s=='leenwoordgroep'
or s=='naamwoordgroep'
or s=='simbool'
then
if (tRequestModify(ENTRY,true)==true) then
NODE:SetAttributeDisplayByString(ATTR,s);--Set attribute instead
DOC:DeleteTreeFromDoc(NODE:GetChild(0));--Delete old text child
bTHISCHANGED=true;
end
end
end
end
if (bTHISCHANGED) then
-- Mark as changed (without updating timestamp)
ENTRY:SetChanged(true,false);
TOTALNUMDONE=TOTALNUMDONE+1
CHANGED=CHANGED+1;
if (CHANGED>=SAVEAFTER) then
--tcSleep:Sleep(1);
tFrameWindow():Save();
--tcSleep:Sleep(1);
if SECONDSSLEEPAFTERSAVE>0 then tcSleep:Sleep(SECONDSSLEEPAFTERSAVE); end
CHANGED=0;
end
end
end
return "";