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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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


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

С чего начинать и где взять.

 

Установка 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

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

Вопрос следующего характера - как в Lua можно грамотно экранировать символ "\"? Чтобы при совпадении с "n" не получался символ перехода на следующую строку ("\n"). Это нужно например в окнах с режимом ComplexMode.

 

Пока сделал такой вариант

string.gsub(s, "\\", "/")
но, наверно можно придумать что-то поизящнее... Изменено пользователем Shadows

Telegram-канал RayTwitty Space

Чтобы при совпадении с "n"

Не понял, т.е. есть типа строки yes\no?

Если есть строка "positive\negative" и надо именно в таком виде и выводить, то придется заменять двумя слешами. А два слеша в коде это или [[\\]] или "\\\\". Т.е. твой же вариант только

string.gsub(s, "\\", "\\\\")
Минус очевиден, замена будет всех слешей, даже тех, кто не при чем. Поизящнее? Использовать регулярные выражения.

Вот, вдруг натолкнет на умные мысли.

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

ТЧ 1.0004. SAP и Trans mod

github

т.е. есть типа строки yes\no?

Да.

 

если они более менее статичны

Данные не статичны, а постоянно меняются.

 

На самом деле оказалось, что внутри режима ComplexMode, идет поиск символа "\\n". Пробовал заменить его на символ с одним слешем - в итоге в строке его вообще не оказалось. Видимо, остается просто использовать мой первый вариант.

Telegram-канал RayTwitty Space

идет поиск символа "\\n"

Вот прямо с двумя слешами?

Надо четко представлять, что на самом деле находится в строке.

на символ с одним слешем - в итоге в строке его вообще не оказалось

Эм, так это, новая строка же, ну или какой другой спец символ. string.gsub(s, "\\n", "\n") - в результирующей строке ты не найдешь слеша.

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

PS: возможно я опять что не понял :)

ТЧ 1.0004. SAP и Trans mod

github

@Desertir, да тут наверно уже вопрос не Lua, а чисто сталкерских заморочек и парсинга строки в режиме ComplexMode.

http://www.lua.org/cgi-bin/demo
print("vasya\new")
||
\/

vasya
ew

print("vasya\\new")
||
\/

vasya\new

Второй вариант работает нормально в Lua, но в сталкере он также расценивается как перенос на следующую строку. Так что видимо ничего лучше обратного слеша не придумать в моем случае.

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

Telegram-канал RayTwitty Space

, 

Да также второй вариант печатает и в игре - 'vasya\new'.

У меня по крайней мере. Правда стоит lua by RvP. Может и поэтому ???

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

Да также второй вариант печатает и в игре - '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. Может и поэтому ???

Не могу знать, но не думаю что как-то влияет это расширение. Изменено пользователем Shadows

Telegram-канал RayTwitty Space

Попробуй

st:SetText([[vasya\new]])

Это конечно то же самое что и "vasya\\new", но SetTextComplexMode явно работает не так как в lua.

Хотелось бы исключить все (нормальные) варианты.

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

@Nazgool,
st:SetText([[vasya\new]])

||
\/

vasya
ew

st:SetText([[vasya\\new]])

||
\/

vasya\
ew

Telegram-канал RayTwitty Space

Что сказать? Видимо строка разбирается в С, а не в lua.
Ничего тут не сделаешь, кроме как переписывать в движке.

Изменено пользователем Nazgool
  • Спасибо 1

Что-то задумался:

А есть ли вариант захвата типа (%b()), но для случая, когда искомых () может быть, а может и не быть (и быть что-то другое, которое и захватывать надо иначе) ?

 

Это все к тому же вопросу об xr_logic.parse_infop()

 

Соблазнительно разрешить в аргументах пробелы.

" +test( 34: 55 56 : 57:66 ) -test1 +test2(test0 )"

 

Мне, пожалуйста,

+, test, 34: 55 56 : 57:66

-, test1

+, test2, test0

 

для 2-й строки третьим захватом можно хоть nil, хоть "" - без разницы.

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


for sgn, fn, args in s:gmatch("([%+%-])([%w_]+)%s*%(?([^%)%+%-]*)") do

print(sgn, fn, args)

end

 

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

А проверить ? Если б работало - не спрашивал бы.

 

В общем, я посмотрел на получающееся у меня

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 == "=" или "!".

Так, пожалуй, все-таки и быстрее, и вменяемее.

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

@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
Изменено пользователем Murarius
  • Неравнодушный сталкер

Доброго времени суток Комрады! Вопрос, выполнится ли тело if'a?

...
local bool = false
if not bool then
какой-то кода
end
... 

 

 

Вернулся получается...

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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