Лишние функции macro api

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

Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 08:33

Математические
  • mf.abs = math.abs
  • mf.atoi = tonumber
  • mf.float — нет необходимости, строки и числа автоматически конвертируются в выражениях
  • iif ~ при необходимости элементарно пишется на Lua, хотя в большинстве случаев принято использовать идиому
    V = Expr and True or False (тут необходимо помнить что выражение "True" не должно быть false/nil)
  • mf.int = math.modf (позволяет получить сразу целую и дробную часть).
    Кроме того: math.ceil и math.floor
  • mf.itoastring.format (ограниченно)
  • mf.max = math.max (параметров может быть >2)
  • mf.min = math.min (параметров может быть >2)
  • mf.mod = Оператор %
Строковые Функции, имеющие эквиваленты в библиотеке LuaFAR
  • mf.env ≈ win.GetEnv
    Отличие: win.GetEnv получает значение, а mf.env может устанавливать/удалять.
    Для несуществующей переменной win.GetEnv ничего не возвращает (mf.env возвращает пустую строку)
  • mf.sleep = win.Sleep
  • mf.xlat = far.XLat
    Способ указания параметров отличается, при использовании без параметров действие то же.
  • mf.msgbox = far.Message
    Порядок и способ указания параметров отличается. Функциональность шире -> параметров больше.
    Нельзя использовать без параметров (первый обязателен).
  • mf.prompt = far.InputBox
    Порядок и способ указания параметров отличается. Функциональность шире -> параметров больше (может быть сложнее в использовании)
  • mf.fattr ≈ win.GetFileAttr
    Отличается способом представления атрибутов (строка а не флаги)
    Следующие атрибуты не обрабатываются:
    Необходимо учитывать для mf.fattr есть парная функция panel.fattr
  • mf.fexist ≈ win.GetFileInfo
    (Если файл не существует, то функция возвращает nil)
  • mf.fmatch ≈ far.ProcessName
    far.ProcessName имеет более широкую функциональность (может быть сложнее в использовании)
    Также в некоторых случаях удобнее воспользоваться string.match или regex.match.
Устаревшие функции
  • key, а также akey(0), waitkey(N,1) (бесполезны, т.к. "числовой эквивалент клавиши" не имеет применения в актуальной версии фара).
    Кроме того, key может проверять корректность текстового представления клавиши (имхо: малополезно, да и работает с ошибками).
  • exit позволяет заканчивать исполнение макроса из вложенных функций и корутин. Имхо: избыточная функция.
Примечания:
  1. В настоящий момент Far поставляется с библиотекой LuaJIT, и некоторые функции имеют расширенное применение: http://luajit.org/extensions.html
  2. Для поддержки интернациональных символов вместо стандартной библиотеки string используется unicode.utf8 (Selene Unicode)
    На практике это означает прозрачную поддержку UTF-8

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

Re: Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 08:34

Избыточные функции (прямых соответствий для них нет, но выполняемые ими задачи в Lua можно решить без специальных функций) В остатке следующие функции:
  • mf.akey
    Сейчас первый параметр функции не имеет смысла, а второй просто не работает.
  • mf.beep
    Cтоит перенести в библиотеку win (MessageBeep)
  • mf.clip
    В LuaFAR есть связанные функции: far.PasteFromClipboard, far.CopyToClipboard, но это только часть функциональности mf.clip.
    На мой взляд mf.clip сильно перегружена, и стоит всё упростить.
  • mf.eval
    В настоящий момент единственное действие, специфичное для mf.eval, это eval(S,2) (подробнее).
  • mf.flock
    Неудобно что при обработке возвращаемого значения надо выделять отдельные биты.
    В Энциклопедии не описано, что с помощью этой функции можно также определить удерживается ли в данный момент клавиша.
    Стоит переделать.
  • mf.mmode
    В настоящий момент практическое значение имеет только один режим: mmode(1,0/1).
    Из документации невозможно понять, какое значение 0/1 служит для запрета, а какое для разрешения вывода на экран.
    Стоит переделать.
  • mf.print
    Эта же функция присутствует и в глобальном окружении.
    Имя совпадает с именем страндартной функции Lua, что в отдельных случаях может представлять проблему.
  • mf.waitkey
    Второй параметр функции сейчас не имеет смысла.
  • Новые функции LuaMacro: mf.GetMacroCopy, mf.Keys, mf.mdelete, mf.mload, mf.msave, mf.usermenu, mf.printf, mf.postmacro

Shmuel
Posts: 5918
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 229 times

Re: Лишние функции macro api

Post by Shmuel » Wed 30 Apr, 2014 08:45

Спасибо, что взялись за это. Некоторые замечания:
1. exit не устаревшая, она позволяет заканчивать исполнение макроса из вложенных функций и корутин. (Мне правда пока её на практике применять не приходилось.)
2. Все использования string в вашем тексте видимо должны быть заменены на unicode.utf8 (или сделать примечание об этом).

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

Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 08:51

Shmuel wrote:exit не устаревшая, она позволяет заканчивать исполнение макроса из вложенных функций и корутин.
Об этом я как-то не подумал...
Надо обсудить необходимо ли это.

Shmuel
Posts: 5918
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 229 times

Re: Лишние функции macro api

Post by Shmuel » Wed 30 Apr, 2014 08:57

Простейший пример:

Code: Select all

function A()
  far.Message"A"
  exit()
end

function B()
  A()
  far.Message"you'll never see me"
end

B()

Shmuel
Posts: 5918
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 229 times

Re: Лишние функции macro api

Post by Shmuel » Wed 30 Apr, 2014 09:34

fattr -> win.GetFileAttr
fexist -> win.GetFileInfo
fmatch -> far.ProcessName

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

Re: Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 09:40

Shmuel wrote:Простейший пример:

Code: Select all

function A()
  far.Message"A"
  exit()
end

function B()
  A()
  far.Message"you'll never see me"
end

B()
На практике я тоже никогда не использую exit:

Code: Select all

function B()
  if A() then far.Message"you'll never see me" end
end
Не уверен что возможность заканчивать выполнение макроса где-то в глубоко вложенной функции - это ценно.
Может быть это даже вредно.

Shmuel
Posts: 5918
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 229 times

Re: Лишние функции macro api

Post by Shmuel » Wed 30 Apr, 2014 09:50

xlat -> far.XLat

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

Re: Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 09:57

Шапку дополню позже.

Некоторые функции LuaFAR отличаются в использовании от своих макро-аналогов.
Но думаю не проблема найти какое-то общее решение.

P.S.
В мануале far.XLat ошибочно ссылается на макро-функцию.

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

Re: Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 11:44

Shmuel wrote:fexist -> win.GetFileInfo
С помощью win.GetFileAttr будет тот же результат?
Или есть тонкости?

Shmuel
Posts: 5918
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 229 times

Re: Лишние функции macro api

Post by Shmuel » Wed 30 Apr, 2014 11:57

win.GetFileAttr не работает с * и ?.

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

Re: Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 15:41

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

Smitis
Posts: 1596
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 38 times

Re: Лишние функции macro api

Post by Smitis » Wed 30 Apr, 2014 18:34

mf.print
Имя функции совпадает с именем страндартной функции Lua, что в отдельных случаях может представлять проблему.
Не просто совпадает, это одна и та же функция (см. api.lua)
mf.lcase, mf.ucase = string.lower, string.lower
Имелось ввиду mf.lcase, mf.ucase = string.lower, string.upper?

mf.exit - иногда пригождается для сокращения вложенности условных оператор. Имхо, подобно break имеет право на существование.

П.С.
А вот интересно, почему PasteFromClipboard и CopyToClipboard, а не обычные GetClipboard и SetClipboard?
Разум когда-нибудь победит.

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

Re: Лишние функции macro api

Post by John Doe » Wed 30 Apr, 2014 18:49

Smitis wrote:
mf.print
Имя функции совпадает с именем страндартной функции Lua, что в отдельных случаях может представлять проблему.
Не просто совпадает, это одна и та же функция (см. api.lua)
В этом-то и проблема. Это не стандартная функция.
Smitis wrote: А вот интересно, почему PasteFromClipboard и CopyToClipboard, а не обычные GetClipboard и SetClipboard?
Так в апи плагинов. Или я не понял вопрос.

Smitis
Posts: 1596
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 38 times

Re: Лишние функции macro api

Post by Smitis » Wed 30 Apr, 2014 20:49

John Doe wrote:Это не стандартная функция.
??? http://www.lua.org/manual/5.1/manual.html#pdf-print
Так в апи плагинов. Или я не понял вопрос.
Будем считать вопрос риторическим. Как назвали, так назвали...
Разум когда-нибудь победит.

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

Re: Лишние функции macro api

Post by John Doe » Thu 01 May, 2014 05:41

Smitis wrote:
John Doe wrote:Это не стандартная функция.
??? http://www.lua.org/manual/5.1/manual.html#pdf-print
Вот именно, теперь запустите lua.exe и сравните поведение.
Например, попробуйте задать несколько параметров, параметр-таблицу, и т.п.

Да и зачем бы стандартную функцию определять в api.lua и помещать в таблицу mf.

Post Reply

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