Dennis_Chikin 3 658 Опубликовано 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 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 20 Июля 2015 Поделиться Опубликовано 20 Июля 2015 (изменено) Вот, черт возьми, как-то раньше и не приходилось сталкиваться. А тут выяснилось. В общем для тех, кто ещё не попадался на этом. Я всегда считал, что при работе со строками, подобные записи : x = s:match('pattern') -- и x = string.match(s, 'pattern') эквивалентны. Оказывается нет. В первом случае 's' обязана быть строкой. А во втором не обязательно. В функции 'string.match' (не проверял, но по ходу и в других должно быть также) производится попытка преобразования 's' в строку. Теперь использовать обращение к методу буду с осторожностью. Изменено 20 Июля 2015 пользователем Nazgool 3 1 1 Ссылка на комментарий
RayTwitty 508 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) Вопрос следующего характера - как в Lua можно грамотно экранировать символ "\"? Чтобы при совпадении с "n" не получался символ перехода на следующую строку ("\n"). Это нужно например в окнах с режимом ComplexMode. Пока сделал такой вариант string.gsub(s, "\\", "/")но, наверно можно придумать что-то поизящнее... Изменено 21 Августа 2015 пользователем Shadows Ссылка на комментарий
Desertir 202 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 Чтобы при совпадении с "n"Не понял, т.е. есть типа строки yes\no? Если есть строка "positive\negative" и надо именно в таком виде и выводить, то придется заменять двумя слешами. А два слеша в коде это или [[\\]] или "\\\\". Т.е. твой же вариант только string.gsub(s, "\\", "\\\\")Минус очевиден, замена будет всех слешей, даже тех, кто не при чем. Поизящнее? Использовать регулярные выражения. Вот, вдруг натолкнет на умные мысли. PS: тут или править исходные данные, если они более менее статичны, или заменять что то плохое на что то хорошее, больше никак. ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
RayTwitty 508 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 т.е. есть типа строки yes\no?Да. если они более менее статичныДанные не статичны, а постоянно меняются. На самом деле оказалось, что внутри режима ComplexMode, идет поиск символа "\\n". Пробовал заменить его на символ с одним слешем - в итоге в строке его вообще не оказалось. Видимо, остается просто использовать мой первый вариант. Ссылка на комментарий
Desertir 202 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 идет поиск символа "\\n"Вот прямо с двумя слешами? Надо четко представлять, что на самом деле находится в строке. на символ с одним слешем - в итоге в строке его вообще не оказалосьЭм, так это, новая строка же, ну или какой другой спец символ. string.gsub(s, "\\n", "\n") - в результирующей строке ты не найдешь слеша. Ты же в курсе, что слеш - знак экранирования? Чтобы написать слеш в строку, надо написать 2 слеша в коде и т.п. PS: возможно я опять что не понял ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
RayTwitty 508 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) @Desertir, да тут наверно уже вопрос не Lua, а чисто сталкерских заморочек и парсинга строки в режиме ComplexMode.http://www.lua.org/cgi-bin/demoprint("vasya\new")||\/ vasya ew print("vasya\\new")||\/ vasya\new Второй вариант работает нормально в Lua, но в сталкере он также расценивается как перенос на следующую строку. Так что видимо ничего лучше обратного слеша не придумать в моем случае. Изменено 21 Августа 2015 пользователем Shadows Ссылка на комментарий
Nazgool 250 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) , Да также второй вариант печатает и в игре - 'vasya\new'. У меня по крайней мере. Правда стоит lua by RvP. Может и поэтому ??? Изменено 21 Августа 2015 пользователем Nazgool Ссылка на комментарий
RayTwitty 508 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) Да также второй вариант печатает и в игре - 'vasya\new'.В окне (статике) в режиме ComplexMode? st = CUIStatic() st:Init(0, 0, 1024, 768) st:SetText("vasya\\new") st:SetTextComplexMode(true) get_hud():AddDialogToRender(st) Правда стоит lua by RvP. Может и поэтому ???Не могу знать, но не думаю что как-то влияет это расширение. Изменено 21 Августа 2015 пользователем Shadows Ссылка на комментарий
Nazgool 250 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) Попробуй st:SetText([[vasya\new]]) Это конечно то же самое что и "vasya\\new", но SetTextComplexMode явно работает не так как в lua. Хотелось бы исключить все (нормальные) варианты. Изменено 21 Августа 2015 пользователем Nazgool Ссылка на комментарий
RayTwitty 508 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 @Nazgool,st:SetText([[vasya\new]]) ||\/ vasya ew st:SetText([[vasya\\new]]) ||\/ vasya\ ew Ссылка на комментарий
Nazgool 250 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) Что сказать? Видимо строка разбирается в С, а не в lua.Ничего тут не сделаешь, кроме как переписывать в движке. Изменено 21 Августа 2015 пользователем Nazgool 1 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 16 Декабря 2015 Поделиться Опубликовано 16 Декабря 2015 Что-то задумался: А есть ли вариант захвата типа (%b()), но для случая, когда искомых () может быть, а может и не быть (и быть что-то другое, которое и захватывать надо иначе) ? Это все к тому же вопросу об xr_logic.parse_infop() Соблазнительно разрешить в аргументах пробелы. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Serge! 127 Опубликовано 16 Декабря 2015 Поделиться Опубликовано 16 Декабря 2015 %b() %b?() Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 16 Декабря 2015 Поделиться Опубликовано 16 Декабря 2015 (изменено) " +test( 34: 55 56 : 57:66 ) -test1 +test2(test0 )" Мне, пожалуйста, +, test, 34: 55 56 : 57:66 -, test1 +, test2, test0 для 2-й строки третьим захватом можно хоть nil, хоть "" - без разницы. Изменено 16 Декабря 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Charsi 440 Опубликовано 17 Декабря 2015 Поделиться Опубликовано 17 Декабря 2015 (изменено) for sgn, fn, args in s:gmatch("([%+%-])([%w_]+)%s*%(?([^%)%+%-]*)") do print(sgn, fn, args) end Изменено 17 Декабря 2015 пользователем Charsi Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
naxac 2 447 Опубликовано 17 Декабря 2015 Поделиться Опубликовано 17 Декабря 2015 @Dennis_Chikin, так, может? ([%w_]+)(%b()*) Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 17 Декабря 2015 Поделиться Опубликовано 17 Декабря 2015 (изменено) А проверить ? Если б работало - не спрашивал бы. В общем, я посмотрел на получающееся у меня for v1, v2, v3 in string.gfind( s, "(%S)([^%s%(%-%+%~%=%!]+)%s*%(?([^%)%-%+%~%=%!]*)%)?" ) do и понял, что лучше таки в два приема, с for v1, v2 in string.gfind( s, "(%S)([^%-%+%~%=%!]+)" ) do ...else v1, v2 = string.match( v2, "([^%s%(]+)%s*%(?([^%)]*)" ) Если v1 == "=" или "!". Так, пожалуй, все-таки и быстрее, и вменяемее. Изменено 17 Декабря 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Serge! 127 Опубликовано 17 Декабря 2015 Поделиться Опубликовано 17 Декабря 2015 (изменено) @Charsi, для полного соответствия ТЗ я бы добавил ещё одну строчку. Я не знаю зачем @Dennis_Chikin нужны были запятые для разделения захватов, но раз обозначил такое условие, то пусть он их и получит. local str = "+test( 34: 55 56 : 57:66 ) -test1 +test2(test0)" for sgn, fn, args in str:gmatch("([%+%-])([%w_]+)%s*%(?([^%)%+%-]*)") do sgn = fn ~= '' and sgn..',' or sgn; fn = args ~= '' and fn..',' or fn print(sgn, fn, args) end Изменено 26 Декабря 2015 пользователем Murarius Ссылка на комментарий
vampirnik77 121 Опубликовано 25 Января 2016 Поделиться Опубликовано 25 Января 2016 Доброго времени суток Комрады! Вопрос, выполнится ли тело if'a? ... local bool = false if not bool then какой-то кода end ... Официальная страница проекта Neof-One Crew Ссылка на комментарий
Kirgudu 1 217 Опубликовано 25 Января 2016 Поделиться Опубликовано 25 Января 2016 @vampirnik77, выполнится. 1 Инструмент Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти