Plugin.require — функция-враппер на замену Plugin.Call и др.

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Plugin.require — функция-враппер на замену Plugin.Call и др.

Post by John Doe »

Цель:
  • работать с плагинами как с высокоуровневыми объектами, спрятав внутри всю кухню (в частности гуиды)
    убрать громоздкие конструкции типа Plugin.Call (guid, Action, par1, par2, ...)
    обращаться к функциям плагина "естественным" образом: <PlugName>.Action(par1,par2, ...)
    таким образом плагин "как-бы" предоставляет библиотеку функций
Получилось простое решение 0000466: Расширение макроязыка плагинами, причём без необходимости каких-либо изменений в фаре и плагинах!

Пользоваться так:
Здесь находится последняя версия фунции

Другая возможная альтернатива — предоставление плагинами нативного Lua API: обсуждение.
Attachments
Plugin.require.7z
(1.63 KiB) Downloaded 197 times
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

Хочется уйти от вызовов типа X,Y=Plugin.Call("94624B7B-FFDB-435F-B955-F99DBBC3BFE0","WindowSize")
Как вам такой подход?

Code: Select all

ConCtrl={}
ConCtrl.mt={}
setmetatable(ConCtrl, ConCtrl.mt)

ConCtrl.mt.__index=function(table,key)
  local idConCtrl  = "94624B7B-FFDB-435F-B955-F99DBBC3BFE0"
  return function(par1, par2)
           return Plugin.Call(idConCtrl, key, par1, par2)
         end
end
Результат: обращение к Plugin.Call замаскировано, и все возможности плагина можно использовать "натуральным" образом, например:
ConCtrl.WindowSize(0,0)
ConCtrl.BufferSize(0,0)
и т.д.
------
Обобщая идею.
Что если написать некую функцию типа

Тогда для человеческого обращения к функциям любого плагина достаточно будет однократного вызова.
Например:

Code: Select all

requirePlugIn("ConCtrl","94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
x,y=ConCtrl.BufferSize(0,0)
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

John Doe
Вы продвигаетесь в Lua семимильными шагами. :)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

Вот второе приближение:
Пользоваться так:

Code: Select all

ConCtrl=requirePlugIn("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
x,y=ConCtrl.BufferSize(0,0)
Просьба прокомментировать.
Какие могут быть недостатки, как можно улучшить.

Пока вижу это:
1. Проверять наличие плагина
2. Обрабатывать переменное количество параметров
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

Ну, очевидный недостаток:

Code: Select all

ConCtrl=requirePlugIn("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
Может сделать как-нибудь, чтобы плагин сам регистрировал свои *.lua модули? В GetPluginInfo ?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

С помощью PostMacro
_G.ConCtrl=requirePlugIn("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
Но я не уверен что стоит делать так жёстко.

Как-то не в духе языка получится...
Хотя, если это будет опцией, то может и ничего.

Update
Впрочем не выйдет.
Чтобы это гарантированно сработало - LuaMacro должен быть загружен первым, и не должен выгружаться в процессе работы.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by zg »

а почему «par1, par2», а не «...»?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

John Doe wrote:С помощью PostMacro
Я уже писал - с помощью PostMacro годится только если плагин preloaded.
Тут бы надо задействовать кэш. Типа плагин говорит имя своего модуля, и фар его начинает автоматически загружать при запуске.
Конечно, того же можно добиться просто скопировав модуль в каталог автозагружаемых скриптов, но это уже "инсталляция"...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

Max Rusov

Code: Select all

x,y=ConCtrl.BufferSize(0,0)
Если не указать нули, то в Plugin.Call придут значения nil, а плагин эту ситуацию не обрабатывает. Поправимо?
zg wrote:а почему «par1, par2», а не «...»?
Потому что прототип :-)
Выше я уже сам это отметил
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

John Doe wrote:Поправимо?
Поправимо, наверное. А как нибудь с "..." не получается?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

Max Rusov wrote:А как нибудь с "..." не получается?
Я ж не специалист. Думаю получится.

Но в любом случае в луа опущенный параметр приходит в функцию как неинициализированный, т.е. nil (если только в функции не предусмотрен разбор неизвестного числа параметров - vararg)
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

John Doe wrote:Но в любом случае в луа опущенный параметр приходит в функцию как неинициализированный, т.е. nil (если только в функции не предусмотрен разбор неизвестного числа параметров - vararg)
Ну так в Plugin.Call как раз предусмотрен разбор переменного числа параметров. Это из-за враппера он не работает.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

А что в результате получает плагин, если параметр опущен?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

John Doe wrote:А что в результате получает плагин, если параметр опущен?
Плагин получает число параметров
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

Max Rusov wrote:Конечно, того же можно добиться просто скопировав модуль в каталог автозагружаемых скриптов, но это уже "инсталляция"...
Можно сравнить со стандартной функцией require, которая служит для загрузки модулей служит: вполне нормально, когда вызов require присутствует в каждом скрипте.
Но с другой стороны, библиотеки lua носят простые и короткие имена, и не приходится помнить гуиды (или откуда-то копировать).
Поэтому аналогия между require и предложенным requirePlugIn - с натяжкой.

Update
Возможно стоило бы написать requirePlugIn именно так: перебирает все dll плагинов (или кэш) и получает гуид по имени dll.
И будет вызываться так: requirePlugIn("ConCtrl")

Даже если вызывать в каждом скрипте отдельно - не напряжно.
Post Reply

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