Лишние функции macro api

Здесь обсуждается всё, что касается макросов.
User avatar
zg
zero-gravity
Posts: 5773
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 142 times
Contact:

LuaMacro — Lua как язык макросов

Post by zg »

Latest post of the previous page:

Shmuel wrote:
Wed 29 Nov, 2017 07:24
mf.replace - до сих пор никогда не использовал, надобности не возникало.
+1, не знал, что вообще такая есть.

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 300 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

John Doe wrote:
Wed 29 Nov, 2017 10:48
На форуме были сравнения скорости, не replace, но показательно.
Вот сравнение быстродействия mf.replace и unicode.utf8.gsub. На длинных строках + длина замены не равна длине образца mf.replace тормозит катастрофически. В данном примере - в 450 раз медленнее, чем unicode.utf8.gsub.

IgorZ
Posts: 679
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 56 times

LuaMacro — Lua как язык макросов

Post by IgorZ »

Shmuel wrote:
Wed 29 Nov, 2017 13:06
John Doe wrote:
Wed 29 Nov, 2017 10:48
На форуме были сравнения скорости, не replace, но показательно.
Вот сравнение быстродействия mf.replace и unicode.utf8.gsub. На длинных строках + длина замены не равна длине образца mf.replace тормозит катастрофически. В данном примере - в 450 раз медленнее, чем unicode.utf8.gsub.
Впечатляет. Правда, в типичном для меня случае (в большом объёме текста найти и заменить один фрагмент порядка 1кб) разница не столь радикальна, всего в три раза, но задуматься заставляет.
Кстати, более коррестно использовать for k=1,N do subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl) end, чтобы избежать возможных регулярок. Но на скорость это влияет мало.

citRiks
Posts: 486
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 144 times
Been thanked: 41 times

Лишние функции macro api

Post by citRiks »

IgorZ wrote:
Fri 01 Dec, 2017 09:11
Кстати, более коррестно использовать for k=1,N do subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl) end, чтобы избежать возможных регулярок. Но на скорость это влияет мало.
наличие библиотеки mf.*,
и в частности mf.rindex()/.replace() для новичков это просто круто.
ибо пока поймешь что у find может быть "plain", поседеешь.
Напоминаю что мало кто мечтaет быть супер-профи в Луа,
а скрипты писать хочет много кто

2.)
IgorZ wrote:
Fri 01 Dec, 2017 09:11
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl)
правильно ли я понимаю что:
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl)
..является полноценной заменой:
mf.replace(subj, patt, repl)
.. когда не надо и не должно быть никаких регулярок?

3.) библиотека MF.* если есть исторически, то пусть будет, вроде же ее не надо майнтэйнить?
это если я правильно понимаю в большинстве своем экспорт фаровских элементраных функций (?)
я тоже если уж на то пошло, отдаю предпочтение нативному Луа, но я не показатель,
и к этому смог придти далеко не сразу (и может быть и напрасно пришел)
скриптописатель должен сам к этому придти,
и не надо его заставлять изучать эту бразило-католическую поделку 5 лет не обновлявшуюся :)
эта "МФ.*" как раз и делает мост для желающих углубиться и перейти,
а без этого моста, по идее, никому лучше не будет

User avatar
John Doe
Бюрократ
Posts: 12739
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 36 times
Been thanked: 282 times

Лишние функции macro api

Post by John Doe »

citRiks wrote:
Sat 07 Mar, 2020 15:28
ибо пока поймешь что у find может быть "plain", поседеешь.
Напоминаю что мало кто мечтaет быть супер-профи в Луа,
а скрипты писать хочет много кто
О чём вы, какие профи.
find это азы. Без понимания которых далеко не уедешь.

Отвлекаться при этом на тупиковую ветвь mf.* только повредит.
citRiks wrote:
Sat 07 Mar, 2020 15:28
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl)
Я не хочу догадываться что это такое страшное вы имели ввиду.
Хотите обсудить - пожалуйста в viewtopic.php?f=57&t=7742
Last edited by John Doe on Sat 07 Mar, 2020 17:12, edited 1 time in total.
https://t.me/FarManager — Telegram чат

buniak_a_h
Posts: 1610
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 109 times
Been thanked: 141 times
Contact:

Лишние функции macro api

Post by buniak_a_h »

John Doe wrote:
Sat 07 Mar, 2020 17:10
citRiks wrote:
Sat 07 Mar, 2020 15:28
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl)
Я не хочу догадываться что это такое страшное вы имели ввиду.
Хотите обсудить - пожалуйста в viewtopic.php?f=57&t=7742
John Doe, это не он имел в виду, это - IgorZ! У меня, вроде, опыт работы с регэкспами не маленький. Но понять, что имел в виду IgorZ - мне терпения и зрения не хватило. По ощущениям - это круто!

IgorZ
Posts: 679
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 56 times

Лишние функции macro api

Post by IgorZ »

buniak_a_h wrote:
Sat 07 Mar, 2020 17:22
John Doe wrote:
Sat 07 Mar, 2020 17:10
citRiks wrote:
Sat 07 Mar, 2020 15:28
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl)
Я не хочу догадываться что это такое страшное вы имели ввиду.
Хотите обсудить - пожалуйста в viewtopic.php?f=57&t=7742
John Doe, это не он имел в виду, это - IgorZ! У меня, вроде, опыт работы с регэкспами не маленький. Но понять, что имел в виду IgorZ - мне терпения и зрения не хватило. По ощущениям - это круто!
На самом деле, всё просто. В subj patt заменяется на repl. Но patt, в общем случае, может быть любым, в том числе, содержать последовательности, интерпретируемые gsub как шаблоны. Поэтому перед основной заменой делается предварительная: в patt во всех местах, которые могут интерпретироваться как шаблоны, добавляется символ процента, экранирующий "шаблон". Просто, в самих шаблонах тоже добавлены символы процента, чтобы заменяемые символы интерпретировались как символы, а не как шаблоны. Конструкция проверена на корректность работы.

P. S. Кстати, только что подумал, что repl тоже, по идее, стоит подвергать аналогичной трансформации. Примерно так:

Code: Select all

subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"),:gsub("%%[0-9]","%%%0"))
. Но этот вариант я ещё не тестировал. Да и по скорости надо бы уточнить: возможно, будет не очень хорошо.
P. P. S. Протестировал. Последний вариант по скорости примерно так же. Но, в случае, если repl содержит шаблоны замены, результат корректен и идентичен mf.replace , в отличие от предыдущего.
Last edited by IgorZ on Tue 10 Mar, 2020 06:19, edited 4 times in total.

User avatar
John Doe
Бюрократ
Posts: 12739
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 36 times
Been thanked: 282 times

Лишние функции macro api

Post by John Doe »

А если сравнить скорость с более простым паттерном %p
https://t.me/FarManager — Telegram чат

IgorZ
Posts: 679
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 56 times

Лишние функции macro api

Post by IgorZ »

John Doe wrote:
Tue 10 Mar, 2020 06:50
А если сравнить скорость с более простым паттерном %p
Проверил. По скорости - примерно то же (в зависимости от строки и образца, то чуть быстрее, то чуть медленнее). Результат во всех проверенных случаях идентичен. Так что, полагаю, из-за большей читаемости такой вариант оптимальнее:

Code: Select all

subj:gsub((patt:gsub("%p","%%%0")),(repl:gsub("%%[0-9]","%%%0")))
Добавил ещё скобки вокруг patt и repl во избежание возможных проблем с возвратом второго результата.

P. S. Почему-то не пришло уведомление на почту, так что заметил ответ только сегодня.

P. P. S. Решил проверить вариант, когда замена вообще не производится. Для исходных данных

Code: Select all

local subj = ("abc"):rep(3e5)
local patt = "/a$b^c"
local repl = "de%0fgh"
результат десятикратного повторения в цикле

Code: Select all

╔══════════════════════╗
║  1│ 447              ║
║  2│ 739              ║
║  3│ 0.60487144790257 ║
╚════ 3 arguments ═════╝
где первый результат - с "[%^%$%(%)%%%.%[%]%*%+%-%?]", второй результат - с "%p", третий - соотношение. Так что не всё так однозначно, хоть и не фатально.

citRiks
Posts: 486
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 144 times
Been thanked: 41 times

Лишние функции macro api

Post by citRiks »

IgorZ,
спасибо, думаю надо бы все эти изыскания упорядочить, вместе с результататми проверок производительности,
и в заголовок темы как-то организовать "для чайников".
А то сама тема диковато выглядит для меня, типа "давайте выкинем MF.*",
а "останемся с чем" выглядит слабовато обоснованно и малопривлекательно для альтернативы.

Еще соображение, допустим можно весь МФ.* заменить кастомными функциями.
И предлагаю подумайте как будут писаться и выглядеть самые простейшие скрипты.

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

Хорошо, теперь как выглядеть будет этот гипотетический простейший скрипт в результате?
будет вначале скрипта пара страниц деклараций неочевидно чего и неочивидно зачем.
Как же скрипт этот будет пониматься, особенно новичками?
Last edited by citRiks on Fri 13 Mar, 2020 17:27, edited 2 times in total.

Post Reply

Return to “Обсуждение макросов”