ProcessMacroFuncW

Разработка Far.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Latest post of the previous page:

Skirda wrote:Что такое "сигнатура" в твоем понимании? Разжуй. Моя твоя не понимайт.
Сигнатура это описание функи, которая будет дергаться из макроса - имя, кол-во и тип параметров. То, что предполагается регистрировать, чтобы потом можно было парсить/компилить/вызывать.

Я же все еще склоняюсь к варианту, что надо ограничиться одной функцией ProcessMacroFuncW, ничего более не регистрировать, продумать простой синтакс вызова ее из макросов. Все входные/выходные аргументы строковые, количество любое. Макро движок должен уметь парсить такой синтаксис даже без наличия плагина, просто формальная проверка синтаксиса.
Skirda wrote:Я вот думаю, что если бы все выдержали бы паузу, как написано красным, то...
Возможно. Пока замолкаю. Желаю успехов в очень нужном деле.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: ProcessMacroFuncW

Post by Skirda »

NightRoman wrote:Я же все еще склоняюсь к варианту, что надо ограничиться одной функцией ProcessMacroFuncW
т.е. ты считаешь, что в макросах вместо
sin(%x)/cos(%y)
удобнее писать
ProcessMacroFuncW("sin",string(%x))/ProcessMacroFuncW("cos",string(%y))
?
We are the Borg. You will be assimilated.
So Say We All!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Пожалуй, еще добавлю пояснение того, о чем я, другими словами. Я за то, что вызов плагинов из макросов будет реализовывать традиционную концепцию оболочек (shell). Каждый плагин это суть единственная команда шелла (аналогия - екзешник, батник), реализуется через ProcessMacroFuncW. Как в шелле, принимает строки, возвращает строки. Сколько она операций на деле может выполнять, это ее дело (плагина и его документации).

То же, что предлагается сейчас - это сильно продвинутее, сложнее и не обязательно лучше. Мне кажется до опыта, что на практике чаще будут вызываться actions плагина (не важно, что возвращается, ничего), а не functions (важно, что возвращается и используется далее в макросе). А центр тяжести планируемой реализации при этом делается очевидно в сторону functions.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessMacroFuncW

Post by Max Rusov »

NightRoman wrote:Мне кажется до опыта, что на практике чаще будут вызываться actions плагина (не важно, что возвращается, ничего), а не functions (важно, что возвращается и используется далее в макросе)
Еще важная область применения - условные макросы, чье поведение зависит от состояния какого-то плагина. Сейчас приходится извращаться, через переменные окружения, например. А так будет очень естественно.
User avatar
HaRT
Moderator
Posts: 10860
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: ProcessMacroFuncW

Post by HaRT »

NightRoman wrote:на практике чаще будут вызываться actions плагина (не важно, что возвращается, ничего), а не functions (важно, что возвращается и используется далее в макросе). А центр тяжести планируемой реализации при этом делается очевидно в сторону functions.
Понятие Action отлично вкладывается в понятие Function, а вот наоборот — нет. Т.ч. уж раз продумывается механизм, то хорошо бы, чтобы он сразу позволял возвращать данные из плагина. Конечно, одно возвращаемое значение — это очень мало. Но большее потребует существенно более сложной конструкции. Т.ч. функции — это своего рода компромисс, я так понимаю.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Skirda wrote:т.е. ты считаешь, что в макросах вместо
sin(%x)/cos(%y)
удобнее писать
ProcessMacroFuncW("sin",string(%x))/ProcessMacroFuncW("cos",string(%y))
?
Нет, конечно (тем более ты еще опустил ID плагина). Но во-первых ProcessMacroFuncW - вообще внутреннее имя для плугов и Фара. Введи в макро язык любое удобное имя для этого. Во-вторых, как я уже написал, функции будут редко вызываться, а чаще надо из плагинов вызывать акции с одним-двумя уточняющими параметрами (хоть могу быть и не прав, сужу со своей колокольни).

Замечу, что макро язык и так не слишком читабелен, удобен для написания и т.п. Так что небольшая жертва "удобности" в пользу простоты реализации может быть и оправдана. Надо взвесить.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Max Rusov wrote:Еще важная область применения - условные макросы, чье поведение зависит от состояния какого-то плагина. Сейчас приходится извращаться, через переменные окружения, например. А так будет очень естественно.
Ну и хорошо, я же не говорю, что должны быть ТОЛЬКО акции, просто центр тяжести реализации будет перенесен на них. В том варианте, что предлагаею я возврат будет тоже, только строки. Ну и пусть возвращается это состояние плагина строкой и проверяется в макросе сравнением со строкой.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessMacroFuncW

Post by Max Rusov »

NightRoman
К чему Вы призываете? Как я понимаю _уже_ реализовано так как, "удобно", а не так как "просто". Вы предлагаете все выкинуть - и сделать хуже? Бойтесь своих желаний - иногда они сбываются :)
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

HaRT
Я за "шелл" подход в макросах, а не за "язык программирования". В шелл команды возвращают массив строк по сути. Можно назвать это и функцией, если хочется.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Max Rusov wrote:NightRoman
К чему Вы призываете? Как я понимаю _уже_ реализовано так как, "удобно", а не так как "просто". Вы предлагаете все выкинуть - и сделать хуже? Бойтесь своих желаний - иногда они сбываются :)
Оно еще не реализовано. Инфраструктура этого дела еще не сделана. Вот там все зло и будет, по-моему.

Я не призываю переделать, а говорю как бы делал сам.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessMacroFuncW

Post by Max Rusov »

NightRoman wrote:В шелл команды возвращают массив строк по сути.
А разве в PowerShell это концепция не признана "устаревшей"? :) Я думал, он манипулирует объектами...
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Max Rusov wrote:
NightRoman wrote:В шелл команды возвращают массив строк по сути.
А разве в PowerShell это концепция не признана "устаревшей"? :) Я думал, он манипулирует объектами...
Ну а при чем тут это (хотя очень одобряю аналогию)? Разве то, что сейчас "уже рализовано" оперирует объектами?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessMacroFuncW

Post by Max Rusov »

То что сейчас реализовано - суть статические методы класса. Отсюда до объектов уже недалеко.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

Max Rusov wrote:То что сейчас реализовано - суть статические методы класса. Отсюда до объектов уже недалеко.
Ну это уже тема как далеко развивать макроязык.

Кстати, аналогия шелла ведь уже есть в плагинах (если плагин уже реализует комстроку с префиксом). Туда передает вообще единственная строка, и ничего, это считается нормально. Если бы хоть это можно было дернуть из макроса, уже было бы здорово.

Если будет сложный, продвинутый и работающий вариант - я только "за". Просто боюсь, не забуксовало бы оно где-нибудь из-за сложность задумки или не затянулось бы на очень долго. Сорри, конечно, но такое ведь бывает.

P.S. ну и конечно, "ручной" регистрации надо бы избежать, как для конечного пользователя, так и для плагинописания.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: ProcessMacroFuncW

Post by SUSim »

А почему, просто, не добавить MacroPrefix, по аналогии с CommandPrefix, в PluginInfo? Плагины же сами парсят командную строку по своему префиксу, вот и здесь пусть этим же занимаются, только еще плагинам надо дать возможность читать/изменять/создавать переменные макроса... Фару тогда остается закэшировать эти MacroPrefix'ы. При выполнении макроса встретив MacroPrefix вызывать OpenPluginW с OPEN_FROMMACRO и указателем на строку для обработки, тогда даже от callplugin можно отказаться :)

в плагине:

Code: Select all

MacroPrefix="calc";
в макросе:

Code: Select all

%a=""; %b=1; calc("%a=sin(%b*pi/2)") $if (%a=="") print("Ошибка!") $else print(%a) $end
ИМХО это проще всего для фартим, но труднее придется плагинописателям, ну и менее нативно чем:

Code: Select all

%b=1; print(sin(%b*pi/2))
SimSU ··· ·· -- ··· ··-
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: ProcessMacroFuncW

Post by NightRoman »

SUSim
Идея MacroPrefix, по аналогии с CommandPrefix, в PluginInfo и аналогичным кэшированием - ИМХО, идеальная, есть проверенный механизм, на который нареканий, кстати, практически нет. Остальная часть предложения у меня вызывает сомнения. Должна быть обычная функа обработчик префикса, только понавороченней, чтоб принять сколько угодно строк и вернуть сколько угодно строк (освобождение возвращенных строк надо тоже продумать).

Парсинга аргументов плагину не избежать. Но не до такой же степени все валить на плуг, как парсить "%a=sin(%b*pi/2)" - этим пусть макродвижок занимается, плуг пусть только "sin" префикс предоставляет, а макрос принимает результат и уже использует его в выражении макроса, как обычно.

(но это все вразрез с текущей реализацией идет, обсуждаем чисто гипотетически)
Post Reply

Return to “Development”