Перейти к контенту

Язык Lua. Общие вопросы программирования


Malandrinus

Рекомендуемые сообщения

(изменено)

malandrinus

Исходя из собственного незначительного опыта, и для упреждения беспорядка в топике предлагаю вынести в шапку следующие пункты :

  1. 1 Установка Lua

2 Справочник по Lua 5.1

  • 2.1 Введение

2.2 Описание языка

2.3 Стандартные библиотеки

2.4 ООП

3 Ссылки

На данный момент считаю этот набор достаточным. По мере необходимости построение можно будет расширять и дополнять.

Думаю что в таком контексте наполнение топика общей информацией будет более упорядоченным.

Это лично моё, субъективное, мнение, т.к. для подобного порядка наполнения имею немало информации.

Пункты от 2.1 до 2.4 расширятся также. (например описание COROUTINE можно перенести в "2.3 Стандартные библиотеки".

Но это уже по ходу дела.

Хотелось бы услышать мнение сообщества.

 

------------------------------

У меня установлены свои версии, но качаем новейшие.

Для пункта "1 Установка Lua"

Качаем и устанавливаем Lua for Windows. Например отсюда :

http://code.google.com/p/luaforwindows/downloads/list

 

P.S. У меня проверенная, надёжная старушка 5.1.4-35.

Но не суть.

 

После установки у Вас (по умолчанию) на диске С в папке Program Files появиться папка lua.

Далее по адресу C:\Program Files\Lua\5.1\ удаляем папку SciTE.

 

Качаем SciTE. Тоже например отсюда :

http://soft.softodrom.ru/ap/SciTE-p6800

Устанавливаем её в папку C:\Program Files\Lua\5.1\SciTE

 

Далее идём на (как там Вам удобно) --> "Рабочий стол" --> "Мой компьютер"(Правый клик) --> "Свойства " --> "Дополнительно" --> "Переменные среды"(Параметры) --> в окне "Системные переменные" проверяем наличие полей :

  • Имя переменной LUA_DEV
  • Значение переменной C:\Program Files\Lua\5.1
  • Имя переменной LUA_PATH
  • Значение переменной ;C:\Program Files\Lua\5.1\lua\?.luac
  • Имя переменной Path
  • Значение переменной (смотрим в конце после всего) ";C:\Program Files\Lua\5.1;C:\Program Files\Lua\5.1\clibs"
Если каких то нет, то прописать как указано.

После этого запустить SciTE, написать - print('Hello Word')

В открывшейся консоли должно напечатать - Hello Word

Если напечатало, то можно приступать к дальнейшим настройкам.

 

------------------------------

malandrinus

Вот мои доводы. Только не многое захотят с этим разбираться, а на самом то деле... :

http://scite-ru.googlecode.com/svn/trunk/p...u_Pack_rus.html

А вот либы в сборке, а если нет, то можно легко подключить :

http://code.google.com/p/luaforwindows/

Но это всё уже пойдёт в категорию "Ссылки" :-) Когда соберу до кучи.

Изменено пользователем Cyclone
  • Спасибо 1
  • Нравится 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

malandrinus

Про новые версии сказать ничего не могу. У меня 2.25 .93Ru и интерфейс русский, и настройки не в виде текстового файла, а виде файла properties(это для SciTE то же самое, что и ini)

А это значит что поддерживается фолдинг. Так, не буду забегать вперёд.

Сейчас как раз пишу о настройках редактора. Там пытаюсь кое что рассказать.

 

Добавлено через 43 мин.:

Для пользователей SciTE.

Настройка редактора.

Сразу хочу сказать, что при желании настраивать можно много чего, но я остановлюсь на некоторых из настроек.

Далее вы уже сами будете смотреть что нужно, а без чего можно и обойтись.

Итак, запустите редактор. Выберите пункт меню "Настройки" и в нём перейдите к строке "Подключенные настройки".

В выпадающем списке выберите (по одному) следующие файлы, которые откроются в редакторе :

  • Открыть lua.properties
  • Открыть others.properties
Начнём изменять.

P.S. Я уже и не помню как было изначально, поэтому покажу как у меня, а там Вы уже сами разберётесь.

 

Переходим к файлу lua.properties.

В самом начале ищем строку

file.patterns.lua=*.lua; и т.д.

В конце строки перечисления расширений добавляем (через двоеточие)

file.patterns.lua=*.lua; ... ;*.script

Это делается для того, чтобы к файлам с расширением .script применялась такая же подсветка синтаксиса, как и для lua.

 

Далее опускаемся почти к концу файла и ищем строку :

command.compile.*.lua=LuaC-5.0.exe -o "$(FileName).luc" "$(FileNameExt)"

Комментим её (символом #), и ниже пишем такую строку :

command.compile.*.lua=luac.exe -o "$(FileName).luc" "$(FilePath)"

Это нужно для компиляции файла в бинарник.

 

Теперь (где-то рядышком) ищем строку :

command.go.*.lua=lua -e "io.stdout:setvbuf 'no'" "$(FileNameExt)"

(и если есть строку command.go.subsystem.*.lua;*.macro=3)

Тоже комментим её(их), и ниже пишем новую строку :

command.go.*.lua=lua "$(FilePath)"

Этим самым настраивается интерпретатор для работы с lua.

С этим файлом пока всё. Сохраняем.

 

Переходим к файлу others.properties

В первой же строке :

file.patterns.props= ...

дописываем в конце ;*.ltx

Сохраняем.

После этого открывая в редакторе файлы с расширением *.ltx, к ним применяется подсветка файлов *.INI, *.CFG.

Т.е. все секции окажутся свёрнутыми, и останется только название секции.

Слева от текстового окна находится колонка фолдинга, с помощью которой можно разворачивать/сворачивать блоки, секции.

Свернуть/развернуть сразу все блоки(секции) можно с помощью пункта контекстоного меню, открывающегося при правом клике на окне с текстом кода.

Фолдинг поддерживается также для файлов lua(а благодаря нашим настройкам и *.script), xml и др.

 

Ну вот первая капля в море уже есть :-)

Мог что-то забыть, но походу дела исправим если нужно.

Чуть позже напишу об использовании аббревиатур, в качестве автодополнения кода.

 

Изменено пользователем Gun12
  • Нравится 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Написал

В конце строки перечисления расширений добавляем (через двоеточие)

Через точку с запятой конечно.

Исправьте если можно и удалите, плз, этот пост.

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Вот чувствовал что забыл что-то.

У меня, например, это в отдельной строке (эксперименты знаете ли)

command.go.*.script=lua "$(FilePath)"

Кстати выполнять выделенную часть кода можно комбинацией "Ctrl + 4"

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение
... как это реализовать для скриптов игры (*.script)

Может я не так понял вопрос? Это работает только в контексте активного открытого файла.

Открываешь файл *.script в SciTE, выделяешь нужную часть, нажимаешь "Ctrl+4".

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

При тех настройках что я дал должно работать.

Т.е. по адресу меню "Tools" --> "script" --> должно появиться поле "Выполнить выделенное Ctrl+4"

В файле lua.properties должна быть запись

file.patterns.lua=*.lua;*.wlua;*.lexe;*.glua;*.gluaw;*.mlua;*.clua;*.macro;*.script

Иначе не работает

 

Portable вариант нужно ещё подготовить. Может завтра?

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

В SciTE присутствует боковая панель, в которой (в закладке "abbrev") находится список автоформатов выражений.

Двойной клик на нужной строке вставляет в текст кода необходимое выражение.

Или же при наборе выскочит окошко с возможным макросом, который вставляется по нажатию клавиши Enter/

Имея привычку пользоваться данным инструментом можно не беспокоится о "забытом" end-е, или о...В общем как Вы сами захотите настроить.

А настраивается это дело по адресу .\Lua\5.1\SciTE\abbrev\lua.abbrev

Как и что там писать, думаю, особого труда не составит.

 

malandrinus

Да кто же против? Будут у меня вопросы - задам, будут у других - попытаюсь ответить.

А пока преследую свою цель. А именно постепенно выкладываю информацию согласно своей стандартизации.

Сразу всё выложить не в состоянии.

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение
... и тишина. :-)

Тоже жду кто ответит. Я таких возможностей не знаю. На данный момент считаю, что это можно сделать только из С (Lua C API).

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Artos

Можно написать свою функцию.

Например (прототип)

function string.pegexp(s, ...)
    local t = {...}
    for i = 1, #t do
        if s:match(t[i]) then return true end
    end
end

str=bla-bla
w = str:regexp('one', 'two')

 

Добавлено через 13 мин.:

Это для Сталкера. Для luа ещё проще, через родную таблицу аrg :

function string.pegexp(s, ...)
    for i = 1, arg.n do
        if s:match(arg[i]) then return true end
    end
end

 

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение

Оказалась не лишней в единственном случае.

Измени

for idx, v in ipairs(t0) do

if k~=2 then

...

Или другое число, и твоя проверка становится бесполезной.

В общем это не панацея.

Оператор # вообще ведет себя странно.

Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш.

Хотя и тут встречаются аномалии.

Так что на этот оператор в принципе не стоит делать ставку.

Корректно работает только iраirs.

Или же писать свой "определитель длины"

Поделиться этим сообщением


Ссылка на сообщение
...оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

 

Казалось бы это условие подходит, но...

t = {[1] = "111",[2] = "222",
[3] = "333",
[4] = "444",
[5] = "555"}
t[4]=nil
print(#t)

Темное это дело. Когда-то пытался понять закономерность, да плюнул.

Наверное стоит признаться. Я знал о казусах с оператором # по отношению к таблицам, но промолчал. Думал пронесет. Не пронесло.

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

Насильно никого заставлять использовать тот или иной редактор, те или иные возможности не буду. Я сказал сразу, что настроек много, и каждый вправе использовать нужные. При желании пользователь может не только изменить существующие, но и добавить свои. Как например написать упомянутый тобою скрипт форматирования текста.

Считаю главной фичей этого редактора саму возможность что-то изменять во внутренних настройках.

Р.S. Поверь, не хотел и больше не хочу упоминать запрещенную тобой тему редакторов. Если кому что то нужно, ссылка уже есть. Достаточно.

Поделиться этим сообщением


Ссылка на сообщение
...точку останова

Извини, никак не пойму что это за точка такая?:blush:

Может я и знаю что это такое, но по-своему.

P.S. Попробую дописать про SciTE.

Поделиться этим сообщением


Ссылка на сообщение

Собственно к ответу Artos-а остаётся только добавить.

 

При выполнении файла с расширением .lua, в SciTE выполняется команда из lua.properties :

command.go.*.lua=lua "$(FilePath)"

Т.е. запускается командная консоль lua, находящаяся по адресу, например, C:\Program Files\Lua\5.1\lua.exe

Эта консоль показана в виде окна в нижней части редактора и в ней отображается результат работы скрипта или вспомогательных действий.

Например при выполнении команды "Поиск в файлах" в ней выводятся все файлы с найденным вхождением.

Двойной клик на найденном результате открывает файл, содержащий искомую строку.

Консоль можно открывать/закрывать принудительно "горячей" клавишей F8.

 

Вы можете открыть и сам файл C:\Program Files\Lua\5.1\lua.exe. Появится окно, аналог CMD. Набирать код и получать результат можно и в этом окне.

SciTE как бы разделяет эти операции. Код пишется в окне текстового (скриптового) редактора, а результат в описанном выше окне консоли.

Удобство работы с кодом CMD и тем же кодом в SciTE не подлежит сравнению.

Благодаря этой возможности, любители работы в CMD могут вызвать оную, и работать в окне консоли в режиме обычного текстового редактора.

Напишите в файле *.lua :

os.execute('cmd')

И нажмите F5.

 

Добавлено через 17 мин.:

 

Чуть не забыл. Если Вы работаете в CMD, или Ваш скрипт "завис" можно принудительно остановить его выполнение комбинацией Ctrl+Break.

 

Добавлено через 34 мин.:

И ещё. Это всё работает для ТЧ. Для ЧН мне наладить такой же полигон не удалось. Что-то там изменено в движке, что вызывает у него аллергию на функцию pcall.

А на хpcall тоже?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
...т.е. для запуска надо нажать F5 или такую зелёную кнопочку со стрелочкой вправо на тулбаре, или из меню "Tools" выполнить команду "Go". Я правильно понял? =)

Из меня писатель не лучший чем, скажем, программист. :-(

Когда начинал описание, думал упомянуть и туллбар. Пока дошёл - забыл.

Все описания, что я пишу и хочу написать, основаны на собранных по крохам информации из НЕТ-а и собственных исследованиях.

Поэтому никакой гарантии в плане абсолютной достоверности и правильности "подачи" не даю. Это все-лишь моё понимание.

Я выкладываю эту информацию как макет, в надежде на участие сообщества в приведении её к более полному, достоверному и "читабельному" виду, такому, чтобы наконец собрать всё до кучи и поместить в шапку темы (зачистив при этом посты с процессом поиска и исследования).

Так что не стесняемся высказывать своё мнение, знания и (malandrinus-у) редактировать неверные позиции.:-)

 

Добавлено через 141 мин.:

Хочу залезть глубоко в недра своего виртуального справочника, и показать как хотелось бы сделать описания. К примеру возьму функцию pairs, тем более что уже возникали вопросы по её использованию.

На первый взгляд кажется, что функция проста в использовании. Может быть так оно и есть, но раз уж топик по lua, то углублённое понимание процессов подразумевается само собой. Этим и займёмся

Описание

 

Функция pairs сама по себе возвращает три значения: функцию next, таблицу t, и nil.

tab = {}
f,t,s = pairs(tab)
print(f) --> функция итератор (для итерации pairs использует функцию next)
print(t) --> таблица tab, передаваемая в функцию
print(s) --> nil, как начальное значение индекса

Использование этой функции предусмотрено в расширенной форме записи оператора for.

for k,v in pairs(t) do
    ...
end

Или же, зная какие результаты она возвращает, записать в такой форме :

for k,v in next,t do
    ...
end

Это значит, что на каждом обороте для получения новых значений переменных цикла k и v вызывается итератор.

Применяющийся в функции pairs итератор возвращает два значения. Это ключ (k - key) и значение (v - value) следующего поля таблицы.

Цикл заканчивается, когда итератор вернет nil.

Стоит заметить, что :

  • Функция pairs вычисляется один раз, в отличии от функции итератора возвращаемой ею.
  • Переменные k и v являются локальными только для данного цикла. Вы не сможете использовать их значения после выхода из for.

    Если вам необходимы значения этих переменных, заранее сохраните их в других переменных.

Итерация.

 

Вот что пишет учебник (к этому ещё вернусь):

Порядок следования индексов неопределен, даже для числовых индексов.

Для прохождения по таблице в числовом порядке, используйте числовой for или функцию ipairs.

Посмотрим :

--------------- читаем таблицу ------------------
t = {10,20,40,[3.3]=50,60,[6]=true,k='abc'}
for k,v in pairs(t) do 
    print(k,v)
end
--------------- изменим порядок -----------------
print('--------------')
t = {k='abc',10,20,40,[3.3]=50,60,[6]=true}
for k,v in pairs(t) do 
    print(k,v)
end

Действительно, порядок следования изменился.

Читаем дальше :

См. предупреждения для функции next если Вы хотите в процессе итерации модифицировать таблицу.

.....

Результат работы next неопределен (undefined) если, в процессе сканирования таблицы, Вы присваиваете какое либо значение в несуществующее поле таблицы. Однако Вы можете модифицировать существующие. В частности, Вы можете очистить поля.

Добавим поля :
t = {k='abc',40,10,[3.3]=50,20,[6]=true,60}

n=9
for k,v in pairs(t) do 
    if n<12 then
        t[n]='val_'..n
        n=n+1
    end
end

for k,v in pairs(t) do 
    print(k,v)
end

Теперь очистим (относится к коду выше) :

for k,v in pairs(t) do 
    if k==3 then
        t[k]=nil
    end
end

Но как бы то ни было, первыми читаются поля массива, начинающиеся с индекса 1 в последовательной математической прогрессии до первого поля, значение которого равно nil.

Где это утверждается официально я не знаю, но ещё не встречал случая, который бы опроверг моё убеждение.

В общем тут поле для экспериментов.

 

Notes

 

Тут я попробую представить функцию pairs в развёрнутом виде, т.е. её строение так, как понимаю я :

Для этого изменю эту функции pairs и next на свои, скажем, my_pairs и my_next

function my_next(tab, key)
    key,val = next(tab,key)
    return key, val
end

function my_pairs(tab)
    return my_next, tab, nil
end

for k,v in my_pairs(t) do
    ...
end

И теперь можно изменять результаты работы на свои.

Например будем выбирать поля, в которых значение не является числом :

t = {10,20,['r']=30,40,[3.3]=50,60,[6]=true,r ='abc'}

function my_next(tab, key)
    key,val = next(tab,key)
    while type(val)=='number' do
        key,val = next(tab,key)
    end
    return key, val
end

function my_pairs(tab)
    return my_next, tab, nil
end

for k,v in my_pairs(t) do
    print(k,v)
end

 

 

 

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение
...пока большая часть темы представляет практический интерес не для всех, кто считает себя скриптерами...

Дружище, чтобы знать что именно интересует людей, от них требуется как минимум озвучить свой интерес.

Например мне в ЛС задают вопросы, и я прошу задавать их в этом топике. Но то ли стесняются, то ли ...? Не знаю. Если бы была способность предугадывать желания, то я сменил бы профессию :-)

Поделиться этим сообщением


Ссылка на сообщение

Один хороший товарищ уже всё подключил к ТЧ. Luа в полном составе и работает. Сейчас тестируем.

Только вот не стоит забывать, что функции dеbug,* изначально работают значительно медленнее стандартных. Даже JIТ особо не поможет.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Не я автор.

Поделиться не позволяют морально-этические.

Как только "хозяин" решит, то сам и выложит. Сорри.

 

Ну так а какой глубокий смысл тогда был об этом сообщать?

 

Добавлено через 34 мин.:

Какой смысл?

Были сомнения по поводу нужности этой работы.

Видим что нужно.

Изменено пользователем malandrinus

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
...Что-то типа:
return string.match(str, '^%s*(%S*)')

Первое слово наверное лучше искать так :

return str:match('%S+')

match сам по себе уже ищет первое вхождение

%S исключает пробелы

+ укажет на первый "не пробел" и максимальное продолжение "не пробелов", т.е. на первое слово

Изменено пользователем Gun12

Поделиться этим сообщением


Ссылка на сообщение

К сведению. (и ещё раз возвращаясь к вопросам о скорости выполнения).

 

Хоть сам и говорил о правильном заполнении строгих числовых массивов посредством стандартной функции table.insert, но...

Когда я уверен в структуре моего массива, т.е. в том что он не будет изменяться посредством иных, не предусмотренных методов, то заполнение такового (например таблицы t) с помощью конструкции :

t[#t+1]=какое-то значение

происходит процентов на 25 быстрее чем table.insert

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...