mf.AddExitHandler

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

mf.AddExitHandler

Post by John Doe »

По поводу новой функции AddExitHandler.

Code: Select all

Пример применения:
  local fp = assert(io.open("some file.txt"))
  mf.AddExitHandler(function() fp:close() end)
  -- use fp; return from multiple places; do not care about closing fp
Пример мне кажется неудачный, ведь в случае ошибки закрывать файл не требуется.
Более того, поскольку значение fp будет равно nil, и попытка индексации должна вызывать ошибку, однако при исполнении данного примера ошибок не наблюдается.
Почему?
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

В случае ошибки открытия файла скрипт прекратит исполнение при вызове функции assert, при этом mf.AddExitHandler не будет вызвана.
Если же файл открылся, то, независимо от того, случится в дальнейшем ошибка или нет, файл будет закрыт по окончанию исполнения макроса.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

LuaMacro — Lua как язык макросов

Post by John Doe »

Shmuel wrote: Thu 10 May, 2018 08:40 при этом mf.AddExitHandler не будет вызвана
И верно..

mf.AddExitHandler действительно будет удобна (раньше в этих же целях использовал mf.postmacro)
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

John Doe wrote: Thu 10 May, 2018 08:56 раньше в этих же целях использовал mf.postmacro
postmacro в общем-то почти не хуже для данного применения, но в случае нескольких вызовов postmacro, "деструкторы" будут вызываться в прямом хронологическом порядке, а в случае AddExitHandler - в обратном, что, по идее, более правильно.

P.S. Нет, postmacro для этого лучше не употреблять. Дело в том, что возможны ситуации, когда текущий макрос ещё не завершён, а уже запускается следующий (например, при выводе на экран диалога или меню). И вот этот следующий возьмёт да закроет файл, которым текущий ещё может пользоваться.
Last edited by Shmuel on Thu 10 May, 2018 11:36, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

LuaMacro — Lua как язык макросов

Post by John Doe »

Идея: дополнительные параметры и возвращаемое значение для mf.AddExitHandler (handler).

Code: Select all

mf.AddExitHandler (handler[,...])

Параметры:
  handler:  function

Возвращает:
  значения, переданные в ... (если есть)

Описание:
  1. Данная функция добавляет обработчик, который будет вызван по окончанию
     исполнения макроса.
     Обработчику будут переданы все аргументы, указанные в ... (если есть)
Цель: возможность использовать mf.AddExitHandler в выражениях.
Например:

Code: Select all

local settings = mf.AddExitHandler(function(s)s:Free()end, assert(far.CreateSettings("far")))
(пока не уверен, что стоит на мантис поместить)

Update: https://bugs.farmanager.com/view.php?id=3670
Last edited by John Doe on Thu 08 Nov, 2018 09:12, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

mf.AddExitHandler

Post by John Doe »

А сложно ли доработать AddExitHandler, или создать отдельную функцию, которая бы срабатывала только если макрос завершён аварийно?
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

mf.AddExitHandler

Post by Shmuel »

John Doe wrote: Thu 08 Jan, 2026 23:51 А сложно ли доработать AddExitHandler
Логика там несложная.
https://github.com/FarGroup/FarManager/ ... o.lua#L298
https://github.com/FarGroup/FarManager/ ... #L309-L312
Post Reply

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