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

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

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

Post by John Doe » Mon 25 Feb, 2013 19:13

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

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

Другая возможная альтернатива — предоставление плагинами нативного Lua API: обсуждение.
Attachments
Plugin.require.7z
(1.63 KiB) Downloaded 137 times

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

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

Post by John Doe » Mon 25 Feb, 2013 19:25

Хочется уйти от вызовов типа 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: 5096
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Mon 25 Feb, 2013 19:29

John Doe
Вы продвигаетесь в Lua семимильными шагами. :)

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

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

Post by John Doe » Mon 25 Feb, 2013 19:32

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

Code: Select all

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

Пока вижу это:
1. Проверять наличие плагина
2. Обрабатывать переменное количество параметров

User avatar
Max Rusov
Posts: 3599
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 6 times
Contact:

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

Post by Max Rusov » Mon 25 Feb, 2013 19:47

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

Code: Select all

ConCtrl=requirePlugIn("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
Может сделать как-нибудь, чтобы плагин сам регистрировал свои *.lua модули? В GetPluginInfo ?

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

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

Post by John Doe » Mon 25 Feb, 2013 20:01

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

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

Update
Впрочем не выйдет.
Чтобы это гарантированно сработало - LuaMacro должен быть загружен первым, и не должен выгружаться в процессе работы.

User avatar
zg
zero-gravity
Posts: 5240
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

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

Post by zg » Mon 25 Feb, 2013 20:03

а почему «par1, par2», а не «...»?

User avatar
Max Rusov
Posts: 3599
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 6 times
Contact:

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

Post by Max Rusov » Mon 25 Feb, 2013 20:05

John Doe wrote:С помощью PostMacro
Я уже писал - с помощью PostMacro годится только если плагин preloaded.
Тут бы надо задействовать кэш. Типа плагин говорит имя своего модуля, и фар его начинает автоматически загружать при запуске.
Конечно, того же можно добиться просто скопировав модуль в каталог автозагружаемых скриптов, но это уже "инсталляция"...

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

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

Post by John Doe » Mon 25 Feb, 2013 20:09

Max Rusov

Code: Select all

x,y=ConCtrl.BufferSize(0,0)
Если не указать нули, то в Plugin.Call придут значения nil, а плагин эту ситуацию не обрабатывает. Поправимо?
zg wrote:а почему «par1, par2», а не «...»?
Потому что прототип :-)
Выше я уже сам это отметил

User avatar
Max Rusov
Posts: 3599
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 6 times
Contact:

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

Post by Max Rusov » Mon 25 Feb, 2013 20:13

John Doe wrote:Поправимо?
Поправимо, наверное. А как нибудь с "..." не получается?

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

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

Post by John Doe » Mon 25 Feb, 2013 20:21

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

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

User avatar
Max Rusov
Posts: 3599
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 6 times
Contact:

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

Post by Max Rusov » Mon 25 Feb, 2013 20:30

John Doe wrote:Но в любом случае в луа опущенный параметр приходит в функцию как неинициализированный, т.е. nil (если только в функции не предусмотрен разбор неизвестного числа параметров - vararg)
Ну так в Plugin.Call как раз предусмотрен разбор переменного числа параметров. Это из-за враппера он не работает.

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

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

Post by John Doe » Mon 25 Feb, 2013 20:33

А что в результате получает плагин, если параметр опущен?

User avatar
Max Rusov
Posts: 3599
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 6 times
Contact:

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

Post by Max Rusov » Mon 25 Feb, 2013 20:34

John Doe wrote:А что в результате получает плагин, если параметр опущен?
Плагин получает число параметров

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

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

Post by John Doe » Mon 25 Feb, 2013 20:36

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

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

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

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

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

Post by John Doe » Mon 25 Feb, 2013 21:17

John Doe wrote:Просьба прокомментировать.
Какие могут быть недостатки, как можно улучшить.

Пока вижу это:
1. Проверять наличие плагина
2. Обрабатывать переменное количество параметров

Code: Select all

function Plugin.require(id)
  if not Plugin.Exist(id) then return nil, "not exist plugin with guid '"..id.."'" end
  local NameSpace={}
  NameSpace.mt={}
  setmetatable(NameSpace, NameSpace.mt)
  NameSpace.mt.__index=
    function(table,key)
      return function(...)
               return Plugin.Call(id, key, ...)
             end
    end
  return NameSpace
end
Использовать так:

Code: Select all

ConCtrl,x=Plugin.require("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
if not ConCtrl then error(x) end
x,y=ConCtrl.BufferSize()
P.S.
Разместил функцию в глобальной таблице Plugin

Post Reply

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