Практичні переваги нової системи консультацій у Emacs 24.4


53

Emacs 24.4 поставляється з новою системою консультування. У NEWSфайлі написано:

** Новий пакет nadvice.elпропонує більш легкі консультації. Він шарується так:

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

*** advice-add/ advice-removeдодати / вилучити пораду щодо названої функції, як і defadviceце.

Питання: Які практичні переваги та наслідки цього нового пакету?

Мені особливо цікаві відповіді на наступні моменти:

  • Якщо я використовую лише поради щодо налаштування Emacs (на відміну від написання додаткових пакетів), чи потрібно мені перейти на нову систему? Чи замінить стару систему в якийсь момент?

  • Що саме я можу зробити з новою системою, яку я не можу досягти defadvice?

  • Яке значення має можливість "додавати / видаляти код на будь-якому місці, що функціонує"?

Відповіді:


57

Нова система консультацій має такі переваги:

  • add-function: Це абсолютно новий функціонал, який просто не входив до дезадаптації. Це свого роду гібрид між add-hookта defadvice. Надалі очікуйте більше foo-functionзмінних (модифіковано через add-function) та менше foo-functions(модифіковано через add-hook). Ця функціональність була основною мотивацією до впровадження нової системи порад, спровокованої звітом про помилки із запитом про те, як "поділитись" процесом-фільтром між різними пакетами.

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

  • Простота дизайну: defadvice має різні поняття, які, як правило, важко зрозуміти точно та / або рідко використовуються. Наприклад, різниця між "вмикаючими" та "активуючими" порадами. Або значення "попередньо" та / або "складено". Є також примхи в обробці ad-do-it, наприклад, те, що це схоже на посилання на змінну, а не на виклик, або на те, що вам потрібно (setq ad-return-value ...)явно, а не просто повертати значення.

  • Defadvice страждає від різних проблем wrt макророзширення та компіляції: суть поради не виставляється як "код" (який бачать компілятор і macroexpander), а як "дані", які згодом поєднуються, щоб скласти вираз. Тож макророзширення відбувається пізно (що може спричинити сюрпризи, якщо ви використовуєте подібні речі (eval-when-compile (require 'foo))), а лексичне розслідування важко правильно зберегти.

Що стосується того, чи потрібно вам переходити на нову систему: я маю намір позбутися старої дезадаптації в якийсь момент майбутнього, але я думаю, що це майбутнє порівняно далеке (і спочатку доведеться перейти до 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.

В даний час, переглядаючи довідку про функцію, що рекомендується (у новому стилі), вона надає посилання на допомогу для функції поради, а звідти посилання на джерело (як зазвичай для довідки про функції).

Стара система надала вказівки докстрингу для вбудованих, але коду не було можливості побачити (як правило, я вдався rgrep).

(Особисто я хотів би побачити поєднання старих і нових підходів до відображення допомоги, оскільки мені сподобалось мати вбудовану доктрину, але я впевнений, що це можливо вниз.)


2
Так, дуже погано, що нова система консультацій не дозволяє вам додавати до існуючого рядка doc, як 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's, в той час як add-functionмістить деякі приємні функції для консультування нетрадиційних функцій, таких як процесові фільтри (що, можливо, було можливо defadvice, але я не впевнений, як).

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



Так. Нове - інше, не більше. І так, багато використовується defadviceтам (і надалі буде).
Дрю

0

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

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

IOW, так само, як ви поступово змінюєте свою схему пошуку, так що ви можете вдосконалити пошук на ходу, використовуючи кілька фільтрів.

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

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

Але саме в цьому хороша надвірка. Підсумовуючи, надвисока настільки зручна для комбінування функцій, що може полегшити інтерактивне вдосконалення пошукової фільтрації. (Докладніше про це див. У динамічній фільтрації пошукових запитів .)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.