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

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

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

Postby John Doe » Mon 25 Feb, 2013 21:17

Latest post of the previous page:

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

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

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

Postby John Doe » Mon 25 Feb, 2013 22:48

Думаю как лучше добавить сюда обработку Plugin.Config и Plugin.Menu.
Вероятно для них придётся зарезервировать ключи "_Сonfig", "_Menu".
Плюс ещё один ключ может потребоваться получении гуида плагина - "_id"

Ещё надо подумать о случае, когда плагин не имеет именованого ключа.
Т.е. вызывается примерно так: Plugin.Call(guid, n1, n2, n3).
Для этого нужно тоже зарезервировать какой-то ключ, например "_main".

Как-то не слишком всё красиво выходит...
Поправьте пока не поздно, а то я вам напридумываю велосипедов.

Shmuel
Posts: 4952
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 123 times

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

Postby Shmuel » Mon 25 Feb, 2013 22:55

Оптимизировал немного requirePlugin (название не очень удачное, по-моему).

Code: Select all

function requirePlugin(id)
  local mt = {}
  local NameSpace = setmetatable({}, mt)
  mt.__index=function(table,key)
      NameSpace[key] = function(...) return Plugin.Call(id,key,...) end
      return NameSpace[key]
    end
  return NameSpace
end

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

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

Postby John Doe » Mon 25 Feb, 2013 23:03

Спасибо за оптимизацию!
Shmuel wrote:(название не очень удачное, по-моему).

По аналогии со стандартным require.
В прошлом сообщении я предложил поместить require в таблицу Plugin.
Если есть более удачные идеи - welcome.

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

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

Postby John Doe » Tue 26 Feb, 2013 00:36

Очередной вариант:
Позволяет всё это:

Code: Select all

x,y=ConCtrl.BufferSize()         --равнозначно
x,y=ConCtrl._Call("BufferSize")  --равнозначно
ConCtrl._Menu()
ConCtrl._Config()
msgbox(ConCtrl._id) --может понадобиться для конструкции типа if Dlg.Owner==ConCtrl._id

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

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

Postby John Doe » Tue 26 Feb, 2013 01:02

Эти подчёркивания мне не нравятся, вероятно нужен какой-то отдельный способ вызова Plugin.*
Пока просто убрал подчёркивания:

Code: Select all

  NameSpace.Id = id
  for _,f in ipairs{"Call","Command","Config","Exist","Menu"} do
    NameSpace[f] = function(...) return Plugin[f](id, ...) end
  end

Если вдруг надо понадобиться действительно передать эти значения в Plugin.Call - можно воспользоваться <NameSpace>.Call
Полный текст:
Возможности:

Code: Select all

ConCtrl=Plugin.require("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")
if not ConCtrl.Exist() then error("not exist plugin with guid '" ..ConCtrl.Id.. "'") end
msgbox(ConCtrl.Id)   -- может также понадобиться для конструкции типа if Dlg.Owner==ConCtrl.Id
x,y = ConCtrl.BufferSize()         --равнозначно
x,y = ConCtrl.Call("BufferSize")   --равнозначно
ConCtrl.Menu()         --Plugin.Menu()
ConCtrl.Call("Menu")   --Plugin.Call("Menu")
ConCtrl.Config()
ConCtrl.Command("/Scale=4 /Load=DOS.PLT")
Last edited by John Doe on Tue 26 Feb, 2013 11:44, edited 6 times in total.
Reason: Добавлено: <NameSpace>.Exist

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

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

Postby John Doe » Tue 26 Feb, 2013 01:36

Так, в предыдущем сообщении видимо изобретён велосипед.
Хотелось бы вызывать Call/Cmdline/Config/Menu как "методы", через двоеточие: ConCtrl:Menu()
Надо разбираться с ооп...

Shmuel
Posts: 4952
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 123 times

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

Postby Shmuel » Tue 26 Feb, 2013 10:53

John Doe wrote:

Code: Select all

function Plugin.require(id)
  if not Plugin.Exist(id) then return nil, "not exist plugin with guid '" ..id.. "'" end
  ......
end

Так делать не надо.
Во-первых, на момент вызова Plugin.require плагин id может быть не загружен, но быть загружен позднее.
Во-вторых, на момент вызова Plugin.require плагин id может быть загружен, но быть выгружен позднее.

Вместо этого можно сделать поле-функцию NameSpace.Exist.

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

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

Postby John Doe » Tue 26 Feb, 2013 11:00

Отредактировал в прошлом сообщении.

Smitis
Posts: 1431
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 9 times
Been thanked: 21 times
Contact:

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

Postby Smitis » Tue 26 Feb, 2013 11:49

Маленькая придирка :) - может лучше require с большой буквы, как и остальные функции в Plugin?
Разум когда-нибудь победит.

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

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

Postby John Doe » Tue 26 Feb, 2013 12:31

Как-бы специально с маленькой, чтобы подчеркнуть отличия :-)
Но это не имеет значения.

Давайте лучше большие придирки.
В конечном счёте хочется чтобы что-то подобное было "из коробки", в составе LuaMacro.
Тогда мы автоматически получим удобные интерфейсы для всех плагинов.

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

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

Postby Max Rusov » Tue 26 Feb, 2013 12:39

John Doe wrote:Тогда мы автоматически получим удобные интерфейсы для всех плагинов.

Для Plugin.Call тут слишком много допущений.
1. Что первым аргументом идет "имя функции"
2. Что "имя функции" строковое
3. Что все аргументы передаются отдельно (а не кодируются в строку)

IMHO, lua-интерфейс к плагину должен поставляться вместе с плагином, т.к. только автору плагина известны все эти тонкости...

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

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

Postby John Doe » Tue 26 Feb, 2013 12:45

Имхо это как раз вообще не проблема.
С плагином идёт документация, и там будет указано КАК использовать.

И автор плагина уже сам решит, как ему удобно.
Функция задана числом: ConCtrl.Call(a,b,c) или ConCtrl[a](b,c)
Всё кодируется в строку - ConCtrl.Call(S)

Думаю не надо объяснять, что при наличии Plugin.require в поставке - плагинописатель способен сделать верный выбор.

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

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

Postby Max Rusov » Tue 26 Feb, 2013 12:57

John Doe wrote:Всё кодируется в строку - ConCtrl.Call(S)

Ну так это неудобно. Wrapper бы мог это сам делать.
Вот, например, у плагина EdtFind есть много возможностей вызова через Plugin.Call:

Code: Select all

Plugin.Call(EdtFind, "Find:ИскомаяСтрока Replace:СтрокаЗамены Prompt:0")


А интерфейс хотелось бы:

Code: Select all

EdtFind.Replace(ИскомаяСтрока, СтрокаЗамены, Справшивать)


Конечно, надо бы в плагине программный интерфейс переделать, с учетом новых возможностей... Но все равно не факт, что wrapper всегда только перевызов.

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

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

Postby John Doe » Tue 26 Feb, 2013 13:01

Max Rusov wrote:Ну так это неудобно. Wrapper бы мог это сам делать.
Это всё равно удобнее чем сейчас.
А чтобы стало вообще удобно - автор плагина может переделать интерфейс, если сочтёт нужным.

Враппер как ни крути мысли читать не может.
Даже если сделать в нём разбор строки.

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

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

Postby John Doe » Tue 26 Feb, 2013 13:07

Вот беру первый попавшийся пример.
Как было:

Code: Select all

OpenType = 1
ConEmu = "4b675d80-1d4a-4ea9-8436-fdc23f2fc14b"
callplugin(ConEmu,OpenType)


Как будет (автоматически, без изменений в ConEmu):

Code: Select all

ConEmu = Plugin.require("4b675d80-1d4a-4ea9-8436-fdc23f2fc14b")
OpenType=1
ConEmu[OpenType]()
Не супер, но уже лучше

А если автор ConEmu сочтёт нужным, то сделает и так:

Code: Select all

ConEmu = Plugin.require("4b675d80-1d4a-4ea9-8436-fdc23f2fc14b")
ConEmu.OpenType()

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

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

Postby Max Rusov » Tue 26 Feb, 2013 13:10

John Doe wrote:Враппер как ни крути мысли читать не может.


Ну так я предлагаю: подумать над вариантом, чтобы автор плагина мог прикладывать к нему программный интерфейс, который автоматически подхватывался FAR и сразу становился доступным к использованию в макросах.


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

Who is online

Users browsing this forum: Bing [Bot] and 2 guests