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:

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

Post by John Doe »

Latest post of the previous page:

1. Выбрать уникальное имя (или комбинацию путь/имя) это проблема пользователя.
Собственно то же самое касается и стандартных модулей Lua, поэтому вполне сойдёт.
(Наверно стоит добавить ещё подстановку ".dll")

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

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

Post by Max Rusov »

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

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

Post by John Doe »

Не уверен что всегда лучше, бывает имена такие попадаются...

Добавил строку: if Info.GInfo.Title==name then return win.Uuid(Info.GInfo.Guid) end
Теперь ищет оба варианта.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

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

Post by Max Rusov »

John Doe wrote:Не уверен что всегда лучше, бывает имена такие попадаются...
Ну, имена dll тоже не блещут. Многие добавляют к имени dll разрядность 32/64. Делать разные макросы?
А для всех плагинов, запущенных под wrapper'ом имя dll - loader.dll.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Во-первых, я ведь принял ваше предложение :-)
Во-вторых, в name.dll можно использовать регэкспы.
msgbox(PluginIdByName("Con.+"))
Кстати реальную точку желательно маскировать %.
И поосторожнее с квантификаторами, пример выше неудачный, т.к. в нём "Con" может совпасть не только с именем dll, но и с любой частью пути.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Скриптик для вывода списка загруженных плагинов в виде "id | Title"

Code: Select all

local PluginsList={}
for i,p in ipairs(far.GetPlugins ()) do
  local Info = far.GetPluginInformation (p)
  PluginsList[i] = win.Uuid(Info.GInfo.Guid).." | "..Info.GInfo.Title
end
far.Show(unpack(PluginsList))
Хранить подобную таблицу можно, но ненадёжно: новые плагины могут быть загружены и динамически
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Вот что получилось с нашей функцией:

Code: Select all

function Plugin.require(name)
  local mt = {}
  local PluginNS = setmetatable({_name=name},mt)
  for _,f in ipairs{"Call","Command","Config","Exist","Menu"} do
    PluginNS[f] = function(...) return Plugin[f](PluginNS.Id, ...) end
  end
  mt.__index = function(PluginNS,func)
    if func=="Id" then PluginNS.Id=Plugin.idByName(PluginNS._name)
    else PluginNS[func] = function(...) return Plugin.Call(PluginNS.Id, func, ...) end
    end
    return rawget(PluginNS,func)
  end
  return PluginNS
end
Теперь можно так: ConCtrl=Plugin.require"ConCtrl" или ConCtrl=Plugin.require"Console Control"
Учитывается и случай, когда на момент вызова Plugin.require плагин ещё не загружен.
Честно говоря я не уверен что есть необходимость учитывать: не так часто плагины загружаются динамически, а если и загружаются, то нетрудно перегрузить после этого и макросы.

Скачать можно в шапке.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

John Doe wrote:
IgorZ wrote:Несколько разных способов записи одного и того же неизбежно затруднят освоение LuaFar для малоопытных пользователей.
От этого у вас не получится уйти.
В старом макроязыке всё прямолинейно, но и возможностей было на порядок меньше.
Сейчас же я некоторые макросы по 5 раз переписываю, из спортивного интереса, пытаясь понять а как лучше, красивее.
Единообразнее - красивее. А переписываю я и сам.
John Doe wrote:А вообще к плагину идёт документация. И там описан способ работы. Какой способ автор описал - такой и будет использован. Проблемы нет.
К сожалению, не всегда она достаточна.
John Doe wrote:
IgorZ wrote:Более логично было бы назвать функцию Plugin.register, не оглядываясь на Lua.
А на что же тогда оглядываться? Мало велосипедов?
На значение слова и суть действия. Require Lua подключает модуль, который без этого недоступен. Здесь же для доступного модуля регистрируется персональное имя. Действия разные, значит, и слова должны быть разные.
John Doe wrote:
IgorZ wrote:Кстати, хотелось бы действительно уточнить, насколько трудоёмко автоматизировать создание и заполнение глобальной таблицы плагинов и насколько это было бы востребовано.
От гуидов хотелось бы уйти, и подальше.
Таблица вариант, но лучше закопать их ещё глубже.

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

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

Post by John Doe »

IgorZ wrote:Единообразнее - красивее.
Я вас не понимаю.
Давайте для единообразия все функции приведём к виду Far.Call("Panel","SetPos",...)
IgorZ wrote:К сожалению, не всегда она достаточна.
И какой вывод?
IgorZ wrote:На значение слова и суть действия. Require Lua подключает модуль, который без этого недоступен. Здесь же для доступного модуля регистрируется персональное имя. Действия разные, значит, и слова должны быть разные.
Plugin.require даёт недвусмысленно понять, что в макросе требуются функции плагина. Способ использования функций плагина через заданный NameSpace явно вытекает из конструкции NameSpace=Plugin.require().
Что касается доступности/недоступности, то это философия. Да, сами плагины доступны, но на каком-то низком уровне. Также можно сказать, что и модули доступны, через FFI, alien, loadfile/dofile.
В общем, дело вкуса. Я считаю так правильнее. Но если подобная функциональность будет в LuaFar/Macro, то мне без разницы под каким именем.
IgorZ wrote:Насколько глубоко? С таблицей они перестают фигурировать в тексте, снижая читабельность, но остаются под рукой в случае непредвиденной необходимости в них. Просто и удобно.
В шапке есть пример использования, где фигурирует <NameSpace>.Id
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

John Doe wrote:
IgorZ wrote:К сожалению, не всегда она достаточна.
И какой вывод?
Если все пишут единообразно, порой удаётся вычислить пропущенное в документации по аналогии. Ну и просто поворчал, раз уж к слову пришлось.
John Doe wrote:...В общем, дело вкуса. Я считаю так правильнее. Но если подобная функциональность будет в LuaFar/Macro, то мне без разницы под каким именем.
Да, пожалуй, в конечном итоге стоит согласиться с такой формулировкой.
John Doe wrote:
IgorZ wrote:Насколько глубоко? С таблицей они перестают фигурировать в тексте, снижая читабельность, но остаются под рукой в случае непредвиденной необходимости в них. Просто и удобно.
В шапке есть пример использования, где фигурирует <NameSpace>.Id
Просто вариант с таблицей кажется мне потенциально более широко применимым. Возможно, я недооцениваю какие-то возможности LuaFar, которые делают такую таблицу ненужной.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Изначально функциональность была нацелена на замену Plugin.Call
Потом сюда же интегрировались Plugin.Command, Plugin.Config, Plugin.Exist, Plugin.Menu.
Сейчас они вызываются из общего "неймспейса" как будто их реализует плагин.

Возможно их стоит как-то выделить, например, вызывая их не через точку, как поля, я через двоеточие, как методы.
Для этого требуется (малюсенькое) изменение в коде:

Но остаётся ещё поле Id.
При желании можно и его сделать "методом":

Примеры:

Code: Select all

ConCtrl.BufferSize(x,y)
...
ConCtrl:Menu()
ConCtrl:Config()
ConCtrl:Command("/Scale=4 /Load=DOS.PLT")
msgbox(ConCtrl:Id())
...
Пока думаю, не уверен что это правильное направление.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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

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

Post by John Doe »

Я начал склоняться к тому, что это получится ненужное усложнение.
Думаю стоит оставить их равноправными, в общем-то с точки зрения конечного пользователя неважно КАК они реализованы.
Ну и учитывая то, что имена Command, Config, Exist, Id, и Menu будут заняты - избегать использования их в плагинах.

Это конечно же просто конвенция, а не строгое требование.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

John Doe wrote:Я начал склоняться к тому, что это получится ненужное усложнение.
Я к этому не сразу пришёл.
Вначале хотелось любыми средствами устранить потенциальный конфликт между названиями функций предоставляемых плагином, и семейством Plugin.*
Т.е., хотелось такого:

Code: Select all

NameSpace:Menu() == Plugin.Menu(guid)
NameSpace.Menu() == Plugin.Call(guid, "Menu")
И это вполне возможно:

Но посмотрев на открывшиеся возможности как-то не обрадовался.
Только путаницы добавится.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Regular Expression Search and Replace (RESearch)

Post by John Doe »

Max Rusov wrote:А я предупреждал, что универсальный Plugin.require - это утопия :)
Это почему же?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Regular Expression Search and Replace (RESearch)

Post by Max Rusov »

Ну, как я понимаю, ReSearch "не вписался".
Post Reply

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