Виходячи з відповіді на інше запитання щодо нової системи консультацій :
У старому стилі advice.el
можна було маніпулювати окремими членами аргументованого списку аргументів, не роблячи жодних тверджень щодо тих членів, які не так маніпулювали. Наприклад, наступна порада:
(defadvice ansi-term (around prompt-for-name last)
(let ((name (read-from-minibuffer "Tag: ")))
(and (not (string= name ""))
(ad-set-arg 1 (concat "Term: " name)))
ad-do-it))
дозволяє (необов'язково) надання аргументу буферного імені для ansi-term
виклику, при ansi-term
цьому все одно отримувати свій перший аргумент шляхом запиту відповідно до власної інтерактивної форми.
(Для подальшого ознайомлення, ansi-term
підпис є (PROGRAM &optional BUFFER-NAME)
, і його інтерактивна форма вимагає ПРОГРАМИ з кількома можливими за замовчуванням, але нічого не стосується BUFFER-NAME.)
Я не впевнений, чи можливо це зробити nadvice.el
? Якщо це так, я не впевнений, як це можна зробити. Я знайшов пару способів замінити список аргументів рекомендованої функції.
Наприклад, з * info * (elisp) поради комбінаторів :
`:filter-args' Call FUNCTION first and use the result (which should be a list) as the new arguments to pass to the old function. More specifically, the composition of the two functions behaves like: (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
Інші комбінатори надають подібні можливості, і загальний потік серед них полягає в тому, що, хоча список аргументів функції може бути замінений, усічений, розширений та ін., Очевидний спосіб порадити функції змінити аргумент на заданій позиції у списку без видимого стверджуючи що-небудь про решту .
У обговорюваному випадку автору поради видається неможливим передати ansi-term
лише ім’я буфера, оскільки неможливо побудувати список, який має значення в позиції 1, але нічого, навіть навіть nil
, у позиції 0. У загальному випадку, Авторові поради видається неможливим довільно змінювати аргументи поза позицією 0.
Це здається прикро тим, що для отримання подібного ефекту необхідно скопіювати і вставити код: конкретно, або я можу скопіювати ansi-term
інтерактивну форму і розширити її на свій смак, або я можу скопіювати ansi-term
і розширити її аналогічно. У будь-якому випадку я тепер повинен переглядати частину дистрибутива Emacs Lisp у своєму файлі init, що вважає мене небажаним з точки зору довговічності та естетичності.
Моє запитання полягає в тому, чи можна з цим списком аргументів списувати аргументи nadvice.el
? Якщо так, то як?