Интроспекция макросов/скриптов: получить описание и пр.

Здесь обсуждается всё, что касается макросов.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Как получить description для макроса из самого макроса в runtime при исполнении? (+РЕШЕНИЕ ВСЕ МЕТАДАННЫЕ/ ИНТРОСПЕКЦИЯ)

Post by Xerox »

Latest post of the previous page:

Технически же, я и сам не понял что мы тут сделали.
То ли корявое ООП для ЛУА, то ли другую какую неведомую зверюшку, поскольку что на знакомое мне ООП это мало похоже

Свершили же мы это, дабы облегчить жизнь следующим поколениям, ступившим на тяжкую стезю ФАР скриптинга на ЛУА.
Думаю практических применений тут довольно много, и часть из них, как я считаю, совершенно необходима для нормального девелопмента.
Надеюсь одмины внесут эту небольшую правку "%farhome%\Plugins\LuaMacro\utils.lua" в дистрибутив?
Потому что никакого вреда кроме пользы я лично не вижу..
Last edited by Xerox on Thu 05 Dec, 2019 23:23, edited 3 times in total.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by HaRT »

 ! Message from: HaRT
Я перенёс и переименовал Тему.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Интроспекция макросов/скриптов: получить описание и пр.

Post by John Doe »

Xerox wrote: Thu 05 Dec, 2019 22:36 Свершили же мы это, дабы облегчить жизнь следующим поколениям, ступившим на тяжкую стезю ФАР скриптинга на ЛУА.
Это не есть приемлемое решение, поскольку требует ручной модификации исходников, которую придётся повторять с каждым обновлением.
buniak_a_h wrote: Thu 05 Dec, 2019 14:41 Второе я не понял.

Code: Select all

-- так можно было до LuaMacro build 538
local my_id = Macro {
  description = "test";
  key="CtrlF1"; area="Common";
  action=function()
    local info = mf.GetMacroCopy(my_id)
    far.Show(info.description)
  end;
}
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Интроспекция макросов/скриптов: получить описание и пр.

Post by buniak_a_h »

John Doe, да, это было бы удобно.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by Shmuel »

Интроспекция, наверное, хорошо (хотя жить без неё можно). Есть однако мысль пойти немножко дальше:

- дать функциям action() и condition() доступ ко всем полям макроса, причёи не read-only, а полный доступ
- не отфильтровывать нестандартные (т.е. недокументированные) поля из таблицы макроса, а оставлять (эти поля могут служить внутренними данными макроса)

Тут появится много возможностей "выстрелить себе в ногу", но ведь их и сейчас немало. Какие мнения будут?
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Интроспекция макросов/скриптов: получить описание и пр.

Post by buniak_a_h »

Shmuel wrote: Fri 06 Dec, 2019 14:46 Какие мнения будут?
1. Хотел как раз дописать, что было бы удобно, чтоб можно было в этой же таблице хранить (и обмениваться) свои данные. А тут - Вы …
2. Чтоб не "выстрелить себе в ногу" добавить поле UserData любого типа. Просто меня немного угнетает, что для связи функций condition и action приходится использовать "внешние" переменные. Типа есть ГЛОБАЛЬНЫЕ (public, из _G), Ограниченные (protected, глобальные по файлу-исходнику) и локальные.
Ну и появится инструмент связи макросов, описанных в разных файлах (например, в одном макросе задавать режим работы другого). Это было бы очень правильно.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Интроспекция макросов/скриптов: получить описание и пр.

Post by John Doe »

Shmuel wrote: Fri 06 Dec, 2019 14:46 Какие мнения будут?
Однозначно поддерживаю такое начинание.
Передавать логично аргументом, но уже сейчас у condition/action аргументы отличаются.
buniak_a_h wrote: Fri 06 Dec, 2019 14:59 Просто меня немного угнетает, что для связи функций condition и action приходится использовать "внешние" переменные.
Хочу вас предостеречь от использования в этих целях таблицы макроса: нет гарантии, что вызовы их вызовы всегда будут соответствовать.
Впрочем, внешняя переменная в этом плане не лучше, поэтому желательно другое решение (например общее состояние).
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by HaRT »

John Doe wrote: Fri 06 Dec, 2019 15:05 желательно другое решение (например общее состояние)
Вероятно, стоило бы иметь какой-то объект (экземпляр — вероятно, таблицу), который бы выступал «контекстом» конкретного запуска данного макроса — чтобы развести сам макрос как программный объект и его выполнение как динамический процесс.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by Xerox »

:!: Тут в первом моем варианте редактирования [utils.lua], вылезла интересная побочка. :!:
Вот он первый вариант на всякий случай:
  1. setfenv(macro.action, setmetatable({
  2.  
  3.     _mmd_area   = srctable.area;
  4.  
  5.     _mmd_callback   = srctable.callback;
  6.  
  7.     _mmd_callbackId = srctable.callbackId;
  8.  
  9.     _mmd_code   = srctable.code;
  10.  
  11.     _mmd_condition  = srctable.condition;
  12.  
  13.     _mmd_define = srctable.define;
  14.  
  15.     _mmd_description= srctable.description;
  16.  
  17.     _mmd_filemask   = srctable.filemask;
  18.  
  19.     _mmd_flags  = srctable.flags;
  20.  
  21.     _mmd_group  = srctable.group;
  22.  
  23.     _mmd_guid   = srctable.guid;
  24.  
  25.     _mmd_key    = srctable.key;
  26.  
  27.     _mmd_lang   = srctable.lang;
  28.  
  29.     _mmd_mode   = srctable.mode;
  30.  
  31.     _mmd_prefixes   = srctable.prefixes;
  32.  
  33.     _mmd_priority   = srctable.priority;
  34.  
  35.     _mmd_filename   = FileName;
  36.  
  37.     _mmd_original   = srctable;
  38.  
  39.         }, gmeta))
Но этот первый вариант все еще остается интересным именно этой побочкой,
поэтому его не удаляю из темы, а добавляю второй вариант, который должен быть без побочек:
  1. local tbl_mmd = {
  2.  
  3.     _mmd_area   = srctable.area;
  4.  
  5.     _mmd_callback   = srctable.callback;
  6.  
  7.     _mmd_callbackId = srctable.callbackId;
  8.  
  9.     _mmd_code   = srctable.code;
  10.  
  11.     _mmd_condition  = srctable.condition;
  12.  
  13.     _mmd_define = srctable.define;
  14.  
  15.     _mmd_description= srctable.description;
  16.  
  17.     _mmd_filemask   = srctable.filemask;
  18.  
  19.     _mmd_flags  = srctable.flags;
  20.  
  21.     _mmd_group  = srctable.group;
  22.  
  23.     _mmd_guid   = srctable.guid;
  24.  
  25.     _mmd_key    = srctable.key;
  26.  
  27.     _mmd_lang   = srctable.lang;
  28.  
  29.     _mmd_mode   = srctable.mode;
  30.  
  31.     _mmd_prefixes   = srctable.prefixes;
  32.  
  33.     _mmd_priority   = srctable.priority;
  34.  
  35.     _mmd_filename   = FileName;
  36.  
  37.     _mmd_original   = srctable;
  38.  
  39.         }
  40.  
  41. local env_m = getfenv(macro.action)
  42.  
  43. for k, v in pairs(tbl_mmd) do env_m[k] = v end
  44.  
  45. env_m._mmd = tbl_mmd
  46.  
  47. setfenv(macro.action, env_m)
Третий вариант, менее наглядный, но более изящный и универсальный:
  1. local env_m = getfenv(macro.action)
  2.  
  3. for k, v in pairs(srctable) do env_m["_mmd_"..k] = v end
  4.  
  5. env_m._mmd = srctable
  6.  
  7. env_m._mmd_filename = FileName
  8.  
  9. setfenv(macro.action, env_m)
Prefix "_mmd" расшифровывается как "macro meta data"
Last edited by Xerox on Fri 06 Dec, 2019 16:04, edited 9 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Интроспекция макросов/скриптов: получить описание и пр.

Post by John Doe »

@HaRT, именно это и имелось ввиду.
Можно использовать общее окружение, либо общий аргумент (я скорее за второе).
При этом, можно через это состояние передавать и дополнительные вещи (такие как разобранный регэксп)
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by Xerox »

John Doe wrote: Fri 06 Dec, 2019 12:37 Это не есть приемлемое решение, поскольку требует ручной модификации исходников, которую придётся повторять с каждым обновлением
Ну я предполагал, и спрашиваю, что почтенная публика думает по поводу внести это изменение в дистрибутив (мастер)?
и 2.) чисто технический вопрос, -
можно ли, и как наиболее изящно,
сделать добавленные [_mmd_*] readonly (только для чтения) ?
Last edited by Xerox on Fri 06 Dec, 2019 16:08, edited 2 times in total.
LAT
Posts: 343
Joined: Thu 21 Jan, 2010 20:00
Has thanked: 22 times
Been thanked: 39 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by LAT »

Shmuel wrote: Fri 06 Dec, 2019 14:46 дать функциям action() и condition() доступ ко всем полям макроса, причёи не read-only, а полный доступ
Т.е. в ходе проверки или выполнения макрос сможет менять свои собственные условия выполнения, само действие, область действия, приоритет и т.д.?
Last edited by LAT on Fri 06 Dec, 2019 15:55, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by Shmuel »

LAT wrote: Fri 06 Dec, 2019 15:49
Shmuel wrote: Fri 06 Dec, 2019 14:46 дать функциям action() и condition() доступ ко всем полям макроса, причёи не read-only, а полный доступ
Т.е. в ходе проверки или выполнения макрос сможет менять свои собственные условия выполнения, само действие, область действия, приоритет и т.д.?
Область действия и ключ (поля "area" и "key"), видимо, не сможет, мне кажется это излишним и в реализации проблематичным. Всё остальное, по идее, да.
LAT
Posts: 343
Joined: Thu 21 Jan, 2010 20:00
Has thanked: 22 times
Been thanked: 39 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by LAT »

Shmuel wrote: Fri 06 Dec, 2019 16:05
LAT wrote: Fri 06 Dec, 2019 15:49
Shmuel wrote: Fri 06 Dec, 2019 14:46 дать функциям action() и condition() доступ ко всем полям макроса, причёи не read-only, а полный доступ
Т.е. в ходе проверки или выполнения макрос сможет менять свои собственные условия выполнения, само действие, область действия, приоритет и т.д.?
Область действия и ключ (поля "area" и "key"), видимо, не сможет, мне кажется это излишним и в реализации проблематичным. Всё остальное, по идее, да.
С одной стороны - выглядит заманчиво мощно. С другой - как-то излишне запутанно: если вдруг что-то ВНЕЗАПНО перестало/начало работать, отловить, с чего бы соответствующий макрос мутировал, может оказаться не так то и просто. Имхо, стоило бы начать с рассмотрения реальных задач, для которых могут потребоваться такие возможности.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by Xerox »

LAT wrote: Fri 06 Dec, 2019 16:19 С другой - как-то излишне запутанно: если вдруг что-то ВНЕЗАПНО перестало/начало работать, отловить, с чего бы соответствующий макрос мутировал, может оказаться не так то и просто.
Динамические возможности (refelection/dynamic coding) даже в простейших языках, не являются чем-то из ряда вон выходящим.
И при этом считаются весьма полезными и перспективными.
Делов наделать можно и сейчас вполне, переопределить любой макрос, вставить любой зловредный или полезный код.
Для безопасности на экземпляр макроса следует ставить что-то вроде флага modified/date_modified.
Где этот флаг значит "макрос модифицирован ПОСЛЕ того как был загружен с оригинального файла"/"время модификации"
И тогда будет видно где пошалили.
Еще можно "сертифицировать" макросы/скрипты на возможность менять чего-либо в других скриптах,
как например - тупо сделать флаг "allow code modificatiion"
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Интроспекция макросов/скриптов: получить описание и пр.

Post by Shmuel »

LAT wrote: Fri 06 Dec, 2019 16:19 Имхо, стоило бы начать с рассмотрения реальных задач, для которых могут потребоваться такие возможности.
Согласен с вами, не стоит рубить сплеча. Время покажет.
Post Reply

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