Практические преимущества новой системы рекомендаций в Emacs 24.4

53

Emacs 24.4 поставляется с новой системой рекомендаций. NEWSФайл говорит:

** Новый пакет nadvice.elпредлагает более легкие консультации. Это слоистый как:

*** add-function/ remove-function, который можно использовать для добавления / удаления кода в любом месте выполнения функций, например, в процессных фильтрах или <foo>-functionхуках.

*** advice-add/ advice-removeдобавить / удалить совет по именованной функции, так же как и defadviceделает.

Вопрос: Каковы практические преимущества и последствия этого нового пакета?

Меня особенно интересуют ответы на следующие вопросы:

  • Если я использую только советы по настройке Emacs (в отличие от написания дополнительных пакетов), мне нужно переключиться на новую систему? Это заменит старую систему в некоторый момент?

  • Что именно я могу сделать с новой системой, с которой я не могу справиться defadvice?

  • Какое значение имеет способность «добавлять / удалять код в любом месте, несущем функцию»?

itsjeyd
источник

Ответы:

57

Новая система консультаций имеет следующие преимущества:

  • add-function: Это совершенно новый функционал, который просто не был частью defadvice. Это своего рода гибрид между add-hookи defadvice. В будущем ожидайте больше foo-functionпеременных (измененных через add-function) и меньше foo-functions(измененных через add-hook). Эта функциональность была основной мотивацией для внедрения новой системы рекомендаций, вызванной сообщением об ошибке, спрашивающим, как «разделить» фильтр процесса между различными пакетами.

  • Простота реализации: однажды add-functionреализованная, для реализации advice-addфункциональности требуется всего 8 КБ, что в значительной степени обеспечивает всю функциональность из 100 КБ файла advice.el.

  • Простота дизайна: у defadvice есть различные понятия, которые, как правило, трудно понять точно и / или редко используются. Например, разница между «включением» и «активацией» советов. Или значение «pre» и / или «compiled». Есть также и странности в обработке ad-do-it, такие как тот факт, что она выглядит как ссылка на переменную, а не вызов, или тот факт, что вам нужно (setq ad-return-value ...)явно, а не просто возвращать значение.

  • Defadvice страдает от различных проблем, связанных с расширением и компиляцией макрокоманд: тело совета представляется не как «код» (который видит компилятор и макроэкспандер), а как «данные», которые впоследствии объединяются для создания выражения. Таким образом, макроразложение происходит поздно (что может привести к неожиданностям, если вы используете такие вещи (eval-when-compile (require 'foo))), и лексическое копирование трудно сохранить правильно.

Что касается того, нужно ли вам переходить на новую систему: я действительно собираюсь избавиться от старого defadvice в какой-то момент в будущем, но я думаю, что это будущее относительно далеко (и сначала оно должно будет перейти lisp/obsolete, а потом в GNU ELPA).

Стефан
источник
1
Существуют ли планы по добавлению в nadvice.el тех же функций изменения аргументов, которые предлагает старая система рекомендаций?
Аарон Миллер
Нет, это в значительной степени не имеет смысла в контексте nadvice.el, где функции совета - это обычные старые обычные функции. Но вы можете использовать :aroundсоветы (или :filter-argsили :filter-resultсовет) , чтобы получить тот же эффект.
Стефан
2
Я не могу, однако. Предположим, я хочу посоветовать функцию с двумя аргументами, заменив только второй аргумент, чтобы рекомендованная функция по-прежнему запрашивала в соответствии со своей интерактивной формой первый. Новый совет, кажется, предоставляет несколько различных способов заменить интерактивную форму рекомендованной функции, но я не вижу ничего, что предлагало бы больше нюансов, чем это.
Аарон Миллер
@AaronMiller: Пожалуйста, сделайте это отдельным вопросом SX, чтобы его можно было обсуждать без искусственных ограничений комментариев SX.
Стефан
Готово, на emacs.stackexchange.com/q/19233/2162 . Я ценю ваше продолжение. (Мне также было бы любопытно увидеть отчет об ошибке, который вы упомянули в своем ответе, но не смогли найти его с помощью Google или поиска в архиве списка рассылки. Вы не против его связать?)
Аарон Миллер,
9

Одним из явных преимуществ советов, являющихся обычными функциями, является то, что вы можете перейти к определению с помощью find-function.

В настоящее время при просмотре справки для рекомендованной функции (в новом стиле) она предоставляет ссылку на справку для функции совета и оттуда ссылку на источник (как обычно для справки по функции).

Старая система предоставляла встроенный совет docstring, но не было никакого способа увидеть код (я обычно прибегал к нему rgrep).

(Лично я хотел бы увидеть сочетание старых и новых подходов к отображению справки, поскольку мне нравилось иметь встроенную строку документации, но я уверен, что это возможно в будущем.)

Phils
источник
2
Да, это очень плохо, что новая система рекомендаций не позволяет вам добавлять в существующую строку документа, как это defadviceделает. Смотрите этот отчет об ошибках Emacs . Это недостаток.
Дрю
8

Из заголовка файла:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

Насколько я понимаю, основная цель - быть проще, чем старая система рекомендаций, а не иметь больше возможностей. Читая документы, кажется, что он advice-addсодержит подмножество defadviceфункциональных возможностей, в то же время add-functionсодержит некоторые полезные функции для консультирования нетрадиционных функций, таких как фильтры процессов (что, вероятно, было возможно с defadvice, но я не уверен, как).

Насколько я знаю, defadviceэто официально не рекомендуется, так что вы можете свободно использовать его сейчас (и если вы автор пакета, вы, вероятно, захотите продолжать использовать его до тех пор, пока 24.4 не станет более широко распространенным). Однако, похоже, что авторы Emacs хотят полностью перейти на новую систему, так что, вероятно, имеет смысл медленно переключаться.

shosti
источник
Да. Новое другое, не более. И да, есть много использования defadviceтам (и будет продолжать).
Дрю
0

Одна вещь , которую я не видел , упомянутые здесь - хотя в некоторых отношениях это связано с более простой подход (лучше модульности и «клей») «новой» системы советов, которые уже были упомянуты в других ответах - это: гораздо проще добавить, объединить, удалить, изменить порядок и т. д.

Это даже возможно сделать интерактивно, динамически, хотя nadvice нуждается в небольшой помощи, чтобы облегчить это. Я не знаю другого использования nadvice таким образом (интерактивная композиция советов), но есть по крайней мере одно такое приложение. Я использую его в Isearch + , чтобы вы могли добавлять и удалять комбинации произвольных предикатов (фильтров) фильтра Isearch во время поиска.

Точно так же, как вы постепенно меняете шаблон поиска, так вы можете уточнить поиск на лету, используя несколько фильтров.

Фильтрация по поиску осуществляется с помощью переменной isearch-filter-predicate, которая уже давно доступна. И все же фильтры Isearch определяются не часто. Они обычно статичны и предопределены для данного контекста (например, Wdired). Пользователям не очень легко определить и использовать их, по крайней мере, в интерактивном режиме.

Существует только одна переменная, isearch-filter-predicate, поэтому изменение фильтрации действительно означает изменение в единый предикат фильтра, который составляет сочинял функции, совмещая предикаты, чтобы детализировать, расширить или иным образом модифицируют поиск.

Но это именно то, что nadvice хорош в. В общем, nadvice настолько удобен для объединения функций, что позволяет легко улучшить интерактивную фильтрацию поиска. (См. Dynamic Isearch Filtering для получения дополнительной информации об этом.)

Нарисовался
источник