Shmuel wrote: ↑Mon 09 Dec, 2019 22:21
Приведите практический пример полезного применения этого гипотетического состояния.
Передача данных из condition в action.
Это частая задача, решается использованием общего upvalue.
(Теперь можно использовать таблицу макроса, но это ничего принципиально не меняет, т.к. не спасает от ошибки)
И в какой-то момент я поймал не гипотетический а вполне реальный баг, источником которого являлось именно то, что значение upvalue (неожиданно для меня) изменялось, другим запуском этого же макроса.
Я сейчас не вспомню конкретный макрос, но код мог бы быть например таким:
Code: Select all
local upvalue;
Macro {
--
action=function()
far.Timer(function()
-- use upvalue
end)
end;
}
Shmuel wrote: ↑Mon 09 Dec, 2019 22:21
Если есть опасения, что вызов нового макроса затрёт информацию о разобранном регекспе, то можно самым первым действием функции action поместить эту информацию в локальную переменную
Совершенно верно, но абсолютно неочевидно, пока не напорешься на свой баг, и собственноручно не найдёшь суть проблемы.
Shmuel wrote: ↑Mon 09 Dec, 2019 22:21
Сейчас, возможно, это будет проще сделать, поместив результат разбора в таблицу-аргумент.
Да, таблица удобна тем, что легко при необходимости добавлять новые поля, не теряя при этом совместимости.
Но при этом я всё же хочу чётко отделить общие и постоянные свойства макроса от состояний, актуальных в конкретном запуске (и таковых может найтись значимое количество, не сейчас так в будущем).
Shmuel wrote: ↑Mon 09 Dec, 2019 22:21
Просто добавлять ещё один аргумент в condition и action ради данного специфического случая кажется мне не очень оправданным.
Момент с моей точки зрения не столько специфический, сколько концептуальный, и позволяюший лучше защититься от багов, сложных в отладке.
Но я согласен, что аргументов на всё не напасёшься, почему и предложил сделать это первым аргументом, вместо AKEY, убивая при этом двух зайцев разом:
- аргумент AKEY уже есть (в condition), надо только сделать его таблицей (и предусмотреть метаметоды для совместимости)
- функции action и condition будут иметь одинаковую сигнатуру, что удобно и для запоминания, и для документирования.