Язык Lua

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 "";

Источники