У меня есть некоторый код, который использует flet
для временного изменения поведения функций.
;; prevent changing the window
(flet ((pop-to-buffer (buffer &rest args)
(switch-to-buffer buffer)))
(compilation-next-error-function n reset))
Тем не менее, байт-компилятор Emacs выдает предупреждение:
In ag/next-error-function:
ag.el:103:7:Warning: `flet' is an obsolete macro (as of 24.3); use either
`cl-flet' or `cl-letf'.
Однако cl-flet
работает по-другому и не подходит для некоторых случаев использования, и я считаю, что это один из таких случаев.
Варианты, которые я вижу:
Скажите Emacs как-то игнорировать предупреждение.
Сверните мое собственное
flet
.
Каков наилучший подход?
my-flet
) и удалил устаревшее предупреждение, и использую его в любом пакете, который ранее требовал flet.Ответы:
Чтобы получить то же поведение, с которым вы привыкли
flet
, используйтеcl-letf
для изменения значения функции символов.Если бы вы катились самостоятельно
flet
, то простым способом был бы макрос, который расширяется доcl-letf
формы.Редактировать: свернул
источник
cl-letf
неправильную альтернативу (IIRC, он не работает дляflet
символов -ing, которых еще нетfboundp
). Вот почему обратно-совместимая версияflet
немного ... запутанная . "Артур Малабарба написал об этом недавно, в статье «Понимание letf и как она заменяет flet» .
letf
это псевдоним дляcl-letf
, и хотя это, скорее всего, то, что вы хотите, есть небольшая оговорка, на которую указывает Артур:(
noflet
Пакет Nic обеспечивает расширенную функциональность в этом направлении.)источник