Dennis_Chikin 3 665 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка Lua:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106 Руководство «Программирование на языке Lua», третье издание:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-905371
Malandrinus 615 Опубликовано 21 Сентября 2011 Автор Поделиться Опубликовано 21 Сентября 2011 (изменено) Artos, Каковы возможности в LUA (применительно к Сталкеру) по работе из скриптов со стеком? В мануале по LUA достаточно куцая информация и практически только для внешнего использования (применительно к С/С+) ... Как мне помнится, не такая уж и куцая. Работа со стеком там в пространстве имён debug. По причине отсутствия этого пространства имён в версии сталкера этих возможностей там нет. Название языка Lua пишется именно так, с большой буквы. Это не аббревиатура, а имя собственное, означает на бразильском "Луна". Разработчики языка особенно настаивают именно на таком написании названия. Теоретически, поскольку Lua в составе сталкера сделан в виде динамической библиотеки, то можно пересобрать эту библиотеку из исходников и добавить туда то, чего не хватает. Изменено 21 Сентября 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629447
Artos 99 Опубликовано 21 Сентября 2011 Поделиться Опубликовано 21 Сентября 2011 (изменено) Вопрос: Возможно ли по аналогии с перловыми методами из языка Perl составить патерн в Lua для парсинга по нескольким кускам слов? Т.е. имеем несколько масок: Masks = ("one", "two", "three") Возможно ли составить единый патерн, а не использовать три: if string.match(s,"one") or string.match(s,"two") or string.match(s,"three") then --/< 's' - исходная строка P.S. По стеку - ясно, что практических возможностей никаких. (хорошо, раз бразильцы-разработчики настаивают - уважим, буду употреблять Lua, хотя и не всегда соответствует многим источника, откуда черпаю ... ;-)) Изменено 21 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629450
Malandrinus 615 Опубликовано 21 Сентября 2011 Автор Поделиться Опубликовано 21 Сентября 2011 Artos, Возможно ли по аналогии с перловыми методами из языка Perl составить патерн в Lua для парсинга по нескольким кускам слов? Т.е. имеем несколько масок: Masks = ("one", "two", "three") Возможно ли составить единый патерн, а не использовать три: if string.match(s,"one") or string.match(s,"two") or string.match(s,"three") then --/< 's' - исходная строка Вроде в общем случае никак. То что в Perl - это регулярные выражения, там возможностей гораздо больше. Была бы возможность заменить библиотеку в сталкере, можно было бы и регулярные выражения прикрутить. Библиотеки для Lua уже есть. С другой стороны есть ограниченная возможность делать такое в string.gsub. Там можно производить замену на один из вариантов, перечисленных в таблице. В этом случае найденный по шаблону элемент используется как ключ в таблице для получения значения, на которое заменяем. Не совсем то, что надо было, но именно при замене можно получить похожий эффект. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629454
Artos 99 Опубликовано 21 Сентября 2011 Поделиться Опубликовано 21 Сентября 2011 (изменено) malandrinus, задаю вопросы не из теоретический изысканий иль любопытства ради, а все же с учетом практического применения. Мне не столь нужны вариации, что можно сделать иначе, а результат, т.е. оптимизиция как самого кода так и/или времени (второе первично). Просто при своих познаниях и навыках могу чего-то не знать, чего-то упустить/забыть, вот и задаю вопрос к тем, кто может быть нашел/знает решение или наоборот, знает что иначе невозможно. P.S. (подумав) Хотя ... ответ то не только мне предназначен, его и другие читают. Изменено 21 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629460
Nazgool 251 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) 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 Изменено 22 Сентября 2011 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629518
Artos 99 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) Вопрос из категории "не очевидно, но факт": Возвращаясь в вопросу по способу определения типа таблицы: список или нет (#2765) Имеем две таблицы: local t1 = {[2]="222",[3]="333",[4]="444"} и вторую получаем из сторонней: local t0 = {[1]="111",[2]="222",[3]="333",[4]="444"} --/ сторонняя таблица local t2 = {} --/ заготовка 2-ой таблицаы for idx,v in ipairs(t0) do if idx ~= 1 then --/ пропускаем 1-й индекс t2[idx] = v --/ в таблицу запоминаются 2, 3 и 4 end end Распечатка обеих таблиц одинакова (по сути, хотя и различается порядком): 2=222 3=333 4=444 Собственно вопрос(!): Чем различаются t1 и t2 ? (попробуйте найти различие/ответ не заглядывая под спойлер) Пишем код: local t1 = {[2]="222",[3]="333",[4]="444"} for idx,v in pairs(t1) do print(idx.." = "..v) end print("#t1=", #t1) local is_list1 = #t1 > 0 and not next(t1,#t1) print("is_list1=", is_list1) local t0 = {[1]="111",[2]="222",[3]="333",[4]="444"} local t2 = {} for idx,v in ipairs(t0) do if idx ~= 1 then --/ пропускаем 1-й индекс t2[idx] = v --/ в таблицу запоминаются 2, 3 и 4 end end for idx,v in pairs(t2) do print(idx.." = "..v) end print("#t2=", #t2) --/ получаем 4 - странно это local is_list2 = #t2 > 0 and not next(t2,#t2) print("is_list2=", is_list2) --/> получаем 'true' - странно, получается что это список? --/ добавляем проверку на наличие элемента с индексом 1 local is_list = #t2 > 0 and not next(t1,#t2) and next(t2) == 1 print("is_list=", is_list) --/> получаем 'false' - оказывается это НЕ индесированный список!!! Результат: 3=333 2=222 4=444 #t1= 0 is_list1= false --/ т.е. хеш-таблица 2=222 3=333 4=444 #t2= 4 --/? is_list2= true --/ это список??? is_list= false --/ все же нет! Т.о. Gun12, излишняя подстраховка next(t2) == 1 - оказалась не лишней. Но вот в чем разница ответа не имею. Кто подскажет? Заранее спасибо. Добавлено через 6 мин.: Gun12, в вопросе по патерну для нескольких строк меня интересовал единый патерн и приоритет был - оптимизиция времени. Оптимизация кода была все же вторичной задачей. Предложенный вариант однозначно проиграет по времени последовательности проверок по каждой строке. :-( Изменено 22 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629543
Nazgool 251 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 Оказалась не лишней в единственном случае. Измени for idx, v in ipairs(t0) do if k~=2 then ... Или другое число, и твоя проверка становится бесполезной. В общем это не панацея. Оператор # вообще ведет себя странно. Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш. Хотя и тут встречаются аномалии. Так что на этот оператор в принципе не стоит делать ставку. Корректно работает только iраirs. Или же писать свой "определитель длины" Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629564
Artos 99 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) Gun12 Чтобы не углубляться, в вопросе не привел все иные варианты, когда оператор # возвращает не нулевую длину для таблиц с пустыми индексами. Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш В том то и дело, и с чем и связан вопрос выше - ведь заведомо таблица создается НЕ как список, а как хеш. Ведь начальный первый индекс с самого рождения таблицы не ракен единице. Ну а для исключения любых подобных неочевидностей сделал подстраховку так: iCntIdx = #tTbl --/ длина индексированной части таблицы bList = iCntIdx > 0 and not next(tTbl,iCntIdx) --/ флаг списка (true|false) if bList then for i=1,iCntIdx do --/ цикл проверки на отсутствие 'пустых' индексов if tTbl[i] == nil then --/ пустышка? bList = false --/ не список break --/ прерываем по первой пустышке end end end А оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд. Изменено 22 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629569
Nazgool 251 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 ...оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд. Казалось бы это условие подходит, но... t = {[1] = "111",[2] = "222", [3] = "333", [4] = "444", [5] = "555"} t[4]=nil print(#t) Темное это дело. Когда-то пытался понять закономерность, да плюнул. Наверное стоит признаться. Я знал о казусах с оператором # по отношению к таблицам, но промолчал. Думал пронесет. Не пронесло. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629591
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) Итого, с точки зрения гарантированности, достаточности и оптимальности по производительности (по времени) и строк кода, похоже этот вариант наилучший? function is_List(tbl) local count = #tbl --/ длина индексированной части таблицы if count > 0 then --/ есть элементы списка? --/ индексы начинаются с 1 и за 'списком' отсутствует хеш-элемент if next(tbl) == 1 and not next(tbl,count) then for i=2,count-1 do --/ цикл перепроверки: 'отсутствуют пустые элементы?' if tbl[i] == nil then --/ пустышка? return false --/> не список end end return true --/> флаг: это список! end end return false --/> не список end -и или есть недостатки, оптимальнее? Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629756
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 Gun12, при наборе выскочит окошко с возможным макросом, который вставляется по нажатию клавиши Enter/ Имея привычку пользоваться данным инструментом можно не беспокоится о "забытом" end-е Я всё пытался понять, что же именно мне не нравится. После этого поста мысль наконец-то оформилась. Дело в том, что существенная часть подобных фишек создана и продвигается исходя из абсолютно ложной предпосылки, будто программисту нужна помощь при наборе программы. Отсюда появляются что-то вроде вставки даты или автозавершение блоковой синтаксической конструкции. Между тем, в реальной жизни программист проводит 9/10 времени отнюдь не создавая новый текст. Основное время занимает поиск ошибок, отладка, внесение изменений любого рода и с самыми разными целями: исправление, оптимизация, расширение возможностей и т.п. Часть "созидательных" фишек при этом бесполезны, часть - попросту будут мешать (в том числе и загромождая рабочее пространство). По-поводу end-ов. На самом деле мало-мальски опытному программисту не нужна помощь в завершении блоковых конструкций. Вот я к примеру выработал в себе привычку набивать первым делом пустую рамочную конструкцию уже очень давно. Руки пишут завершающую скобку или end просто на автомате. Я бы даже сказал, что попытки редактора сделать это за меня будут мне мешать, и я это по-любому отключу. Пока искал автоматический форматировщик текста Lua (так и не нашел, кстати) вдосталь начитался мнений типа "научись пользоваться табом и ентером, кретин, и не будет проблем с отступами". Примерно так и пишут, я не преувеличиваю. Между тем, я могу назвать как минимум три причины для использования такого инструмента: 1. Потеря форматирования при изменениях. Код может остаться корректным, но ручное проставление табуляций в километровом тексте может быть утомительно. 2. Возможность искать ошибки потерянных/отсутствующих скобок/завершителей. Такие ошибки легко вносятся при изменениях. Никакие инструменты этого не в состоянии предотвратить, а уже отформатированный код при этом даже в каком-то смысле скрывает ошибку. 3. Форматирование чужого кода. В реальной жизни приходится читать и использовать чужой код. В каком он может быть состоянии, не мне вам рассказывать. Исходя из сказанного, могу сформулировать перечень жизненно важных для программисткого редактора фишек: 1. Моноширинный шрифт 2. Подсветка синтаксиса 3. Поддержание текущей позиции табуляции 4. Изменение уровня табуляции фрагментов текста 5. Блоковое выделение (это обычно с зажатым Alt-ом) и операции с блоками - удаление, перемещение и пр. 6. Outlining (сворачивание текста) 7. Авторазметка (автоформатирование) текста по запросу Из этого перечня разве только п.3 относится к первичному набиванию текста и то имеет применение также и при редактировании. Остальное предназначено в основном для удобства работы с уже существующим кодом, в частности для лучшего его понимания. Вот этим программист и пользуется 90% всего времени. Остальное - вторично и стоит при первом знакомстве оставить за кадром. Добавлено через 51 мин.: Artos, оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд. Почему два? Возвращает индекс n, такой что "t[n] не равен nil, а t[n+1] равно nil". Т.е. такой, за которым идёт "дырка" в значениях. Одной вполне хватит. Однако, выходит так, что это правило не соблюдается для "таблиц, рождённых массивами". Т.е. к примеру в этом случае t = {1, 2, nil, 4} мы получим 4 в качестве длины. В принципе, это можно понять, если рассмотреть реализацию таблиц, описанную автором в статье The implementation of Lua 5.0. В каждой таблице есть часть "линейный массив" и часть"хэш-массив". При создании с помощью конструкции {a, b, c, d, e} очевидно всё попадает в часть линейного массива, а оператор длины видимо в этом случае оптимизирован и вместо перебора просто берёт длину массива. Если же создавать массив вразнобой, типа такого: t = {} t[4] = 4 t[2] = 2 t[1] = 1 то в этом случае элементы попадут в хэш-таблицу. Оператор длины сначала посмотрит линейную часть, ничего там не найдёт и затем уже начнёт перебирать оставшиеся элементы из хэш-части, а там уже чёстно найдёт разрыв в значениях и до индекса 4 не дойдёт. В общем всё логично, хотя и выглядит как недокументированная фича. Причём именно фича, а не баг, поскольку это даёт возможность таки перебирать элементы массива пусть и со значениями nil. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629761
Nazgool 251 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 malandrinus Насильно никого заставлять использовать тот или иной редактор, те или иные возможности не буду. Я сказал сразу, что настроек много, и каждый вправе использовать нужные. При желании пользователь может не только изменить существующие, но и добавить свои. Как например написать упомянутый тобою скрипт форматирования текста. Считаю главной фичей этого редактора саму возможность что-то изменять во внутренних настройках. Р.S. Поверь, не хотел и больше не хочу упоминать запрещенную тобой тему редакторов. Если кому что то нужно, ссылка уже есть. Достаточно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629775
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) malandrinus В отличии от модераторов/кураторов у обычных пользователей отсутствует возможность вносить правки (редактировать) в свои посты спустя 15 мин после его опубликования. Моя фраза была уже опровергнута постом #30 Gun12, и то, что я не отреагировал на нее в своем ответном посте - означает согласие (молчание знак согласия). Там же, в моем ответе приведен вариант, качающийся исходного вопроса с учетом всех особенностей (включая и тобою упомянутых познее) применения оператора # в общем алгоритме. Вот критика всего конечного алгоритма способа опредеоения типа таблицы была бы полезна. Вероятно не стОит задаваться вопросом "Почему два?" по поводу некорректности/неправильности фразы, как уже один раз опровергнутой. Иначе придется каждый раз писать поправки/подтверждения/опровержения ранее сказанному по каждому поводу. По редактору: В самом начале мною было высказано мнение, что каждый выбирает себе инструмент "по руке и по задаче". Можно много на эту оффтопную тему высказывать мнений и пр., но ... большей частью все это будет в пустоту, потому что каждому из нас, твоими же словами, "как-то лениво" съезжать с насиженного и переезжать на малоизвестное и пока неудобное. Единственное все же хотелось бы тут упомянуть в дополнение к перечисленному тобою "перечню жизненно важных для программисткого редактора фишек": Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры), т.е. непосредственно в редакторе и даже не записывая чего-либо на диск, можно писать и перепроверять локальные небольшие куски функций/формул, чего не дают иные редакторы. ==================================================== Добавлено через 56 мин.: Вопрос: Нет ли каких "подводных камней" или иных "недокументированных фич" в применяемых ниже операторах/методах, которые могут повлиять не корректность результата? local Number = 9 --/ 10,16,100, ... local abs = Number == math.modf(Number) and math.abs(Number) --/ модуль целочисленного числа if abs then --/ целочисленное? local n = math.floor( math.log10( abs + 1) ) --/ степень ближайшего к модулю бОльшего числа кратного 10-ти if abs >= 10^n and abs < 2^(4*n) then return true --/> кол-во разрядов 'dec' > 'hex' end end Пояснение: Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д. т.е. тогда, когда количество разрядов десятичного значения числа 'Number' больше кол-ва разрядов этого же числа в шестнадцатиричной форме. Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629803
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 (изменено) В рубордовской версии SciTE так и не нашёл возможности ставить точки останова. Непонятно, как отлаживать программу. Кто-нибудь знает? Добавлено через 16 мин.: Artos, Моя фраза была уже опровергнута постом #30 Gun12 Извиняюсь, невнимательно читал. Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры) Я себе давно наладил тестовый полигон для запуска скриптов в игре без перезгарузки. Запуск в игре имеет свою ценность, поскольку скрипт тестируется именно там, где будет реально применяться. Gun12, запрещенную тобой тему редакторов Ощущаю себя исчадием модераторского ада ... Я не запрещал. Во-первых, я не могу ничего запретить, поскольку всего лишь куратор. Во-вторых, я сказал, что буду тереть бессмысленный флуд. То, что навалили здесь в самом начале, не содержало ни грамма информации, сплошное меряние ... редакторами. Добавлено через 15 мин.: Artos, Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д. А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них? На мой взгляд, это даже будет быстрее работать. Изменено 23 Сентября 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-629942
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) malandrinus: А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них?Потому что: - этот вопрос в первую очередь преследует цель получить информацию по применяемым функциям/операторам и возможным их 'закидонам' (по аналогии с оператором #) ... - в данном случае, даже если и имеется потеря некоторой доли скорости выполнения, то а) вычисления в игре производятся в моменты (в основном создание сэйвов), когда лишняя пара милисекунд не важны, и б) компактность кода и универсальность формул также немаловажные критерии. Учитывая диапазон разрядов применяемых в игре (float -> 10 разрядов), то использование проверок 2х9-ти диапазонов (считая отрицательные) далеко не всегда будет выигрышным по скорости; Вот это полная функция: --/ конвертер числа (number) в 'dec' или 'hex' строку (string) function Num2Str(iNum) --/< любое число, применяемое в игре Сталкер if iNum == math.modf(iNum) then --/ целочисленное? local iAbs = math.abs(iNum) --/ модуль числа if iAbs > 9 then --/ число 2-x и более разрядное? --/ степень ближайшего к модулю бОльшего числа кратного 10-ти local iLv = math.floor(math.log10(iAbs+1)) if iAbs >= 10^iLv and iAbs < 2^(4*iLv) then --/ разрядность 'dec' > 'hex'? if iNum >= 0 then --/ не отрицательное? return string.format('%X', iAbs) --/> 'hex'-строка end --/ отрицательное - упаковываем со знаком return "-" .. string.format('%X', iAbs) --/> 'hex'-строка со знаком end end end return tostring(iNum) --/> 'dec'-строка end malandrinus: ... себе давно наладил тестовый полигон для запуска скриптов в игре без перезгарузки1. Что мешает поделиться опытом, а не поверхностной 'частной' информацией? ;-) 2. Ну ... это как бы: malandrinus: ...сказал, что буду тереть бессмысленный флуд. То, что навалили здесь в самом начале, не содержало ни грамма информации, сплошное меряние ... редакторами.И хотя ранее никакого меряния ... редакторами не было (ИМХО), а некоторая дискуссия о предпочтениях и ненавязывании ... Предлагаешь померять(ся) ... чей/какой способ отладки 'на лету' лучшЕЕ? ;-). Повторю: "на вкус и цвет ..." и "инструмент выбирается по руке и по задаче". Могу привести немало примеров, когда отладка "из игры" невозможна и ... не даром упомянул о 'целевой программе'? которая может быть любой, а не только игрою Сталкер. Да и 90% читателей/модмейкеров портала не имеют ни того и ни другого. Скачав и установив оедактор (SciTE) - любой получает возможность писать и проверять коды "на лету" за минуты. 3. Полностью согласен, что запуск 'из игры' имеет свою ценность, о чем и говорил ранее в "бессмысленном флуде". 4. В данном топике мы говорим с ориентиром на Lua, а игра вторична или ... наоборот? ;-) Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-630031
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 Artos, 1. Что мешает поделиться опытом, а не поверхностной 'частной' информацией? ;-) Эээ... два года как это уже сделал 4. В данном топике мы говорим с ориентиром на Lua, а игра вторична или ... наоборот? ;-) игра - это предметная область, которая даёт реальные задачи, решение которых и побуждает изучать Lua. Gun12, у меня просьба. Не мог бы ты завершить свой введение в SciTE и дополнить его краткой информацией о том, как можно запустить написанный скрипт. Вот ты написал: После этого запустить SciTE, написать - print('Hello Word') В открывшейся консоли должно напечатать - Hello Word Написать где, в тексте документа? А почему консоль должна открыться? Что-то надо нажать? Попробуй представить себе, что аудитория нулевая и никаким сторонним багажом не обладает. И, если знаешь, то не мог бы подсказать уже для меня, как в рубордовской версии поставить точку останова? Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-630037
Nazgool 251 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 ...точку останова Извини, никак не пойму что это за точка такая? Может я и знаю что это такое, но по-своему. P.S. Попробую дописать про SciTE. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-630043
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) malandrinus По п.4: Это все же НЕ ответ координатора (ИМХО). - или Lua первичен, остальное вторично - в этом случае дефолтно в вопросах/ответах подразумеваются общее именно для Lua контента и уже потом для конкретной частности; - или Игра первична - в этом случае вопрос/ответ подразумевает в первую очередь именно контент и особенности Игры, а не всевозможности/извраты/недоступности всего/чистого Lua; - или 'демократия' - каждый говорит о своем, кто про чистый Lua, кто про портированный кусок квази-Lua в Игре, кто просто про игру ... Каков ответ координатора о первичности? :-) По полигону: Для Игры (и то с тобою же высказанными ограничениями и частностями) вариант вполне возможен, но ... для вероятно 70% игроков/модмейкеров неприемлем/затруднителен (ЧН/ЗП, нет второго компа, коды именно 3-й категории ошибок, ...). Для изучения Lua - практически не пригоден (более схожь с "чесать ногою ухо"). ИМХО. Пока Gun12 не написал введение по SciTE, отвечу для тех, кто пока не понял: - Писать код (print('Hello Word')) нужно конечно же в документе. Однако, дефолтно открытое первичное окно ("Безымянный") не имеет расширения, что не дает интерпретировать какие команды допустимы ... Следует этот дефолтно открытый документ сохранить с требуемым расширением и тогда - доступны все свойства данного документа/файла. - Консоль открывается автоматически при наличии информации предназначенной для вывода из кодов в консоль. Добавлено через 27 мин.: malandrinus Из твоего описания "полигона": Путём экспериментов я выяснил, что текущим каталогом Lua считает папку bin Вероятно да. Однако, в том же NLC6 (использован Lua-перехватчик by aplet), фокус передается в корень игровой папки (т.е. на верхний уровень относительно 'bin'). Вопросы: (касательно Lua в игре Сталкер) Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально? Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него? Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-630044
Nazgool 251 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Собственно к ответу 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 тоже? Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-630052
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 (изменено) Gun12, Извини, никак не пойму что это за точка такая? Может я и знаю что это такое, но по-своему. Точка останова для отладчика, иначе breakpoint. Это чтобы остановить в нужном месте программу, посмотреть что и как, затем продолжить дальше. Также при наличии отладчика обычно имеется возможность выполнять программу по шагам. В том SciTE, что идёт вместе с Lua, эти команды вынесены прямо на тулбар. А есть отладчик в рубордовском варианте или вообще нет, пока не понял. Artos, Каков ответ координатора о первичности? :-) Зачем так усложнять? Первично то, что будет поддерживать интерес к этой теме. Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально? Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него? по большому счёту, кроме как применительно к пространству имён io понятие текущего каталога больше никак и не использовать. Кроме того, в стандартной библиотеке Lua такого и понятия не вводится явно, как нет и средств управления текущим каталогом. Я бы старался избегать использования каталога "по умолчанию" хотя бы в силу того, что он именно в игре неизвестно какой. Вместо этого, лучше использовать явно заданные абсолютные пути. В движке есть класс FS, который позволяет узнать все пути к каталогам игры. В полигоне я использовал текущий каталог, но мог бы вместо этого использовать класс FS, выяснить каталог со скриптами и использовать его полный путь вместо текущего пути "." (точка - текущий каталог). На тот момент использовать текущий путь казалось проще, кроме того на тот момент я вполне возможно не знал ещё, как пользоваться классом FS в полной мере, только и всего =) Gun12, Собственно к ответу Artos-а остаётся только добавить. т.е. для запуска надо нажать F5 или такую зелёную кнопочку со стрелочкой вправо на тулбаре, или из меню "Tools" выполнить команду "Go". Я правильно понял? =) А на хpcall тоже? а, с тех пор много воды утекло, и я уже выяснил, в чём была проблема. Вылет вызывало использование техники выдачи сообщения в лог get_console:execute("text"). Причём, что самое неприятное, вылет происходил не сразу, а позже, и иногда его не было. Поэтому я долго думал, что проблема в чём-то другом. Так что в общем проблемы нет, надо просто использовать вывод в произвольный файл через пространство имён io (благо в ЧН/ЗП оно уже есть). Это в общем и удобнее намного, поскольку можно выводить в разные файлы и в логе нет мусора. В модифицированном движке можно добавить нормальный вывод в лог (а не как побочную реакцию на ошибочную команду). Тоже будет работать. Изменено 23 Сентября 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/2/#findComment-630061
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти