A seguito di una risposta a un'altra domanda sul nuovo sistema di consulenza :
In vecchio stile advice.el, era possibile manipolare singoli membri dell'elenco di argomenti di una funzione consigliata, senza fare affermazioni su quei membri non così manipolati. Ad esempio, il seguente consiglio:
(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))
consente la fornitura (facoltativa) di un argomento buffer-name a una ansi-termchiamata, mentre ansi-termotterrà comunque il suo primo argomento chiedendo in base al proprio modulo interattivo.
(Per riferimento futuro, ansi-termla firma è (PROGRAM &optional BUFFER-NAME)e il suo modulo interattivo richiede PROGRAMMA con diverse possibili impostazioni predefinite, ma non fa nulla riguardo a BUFFER-NAME.)
Non sono sicuro se questo sia possibile o meno nadvice.el. Se lo è, non sono sicuro di come si possa fare. Ho trovato un paio di modi per sostituire l'elenco degli argomenti di una funzione consigliata.
Ad esempio, da * info * (elisp) Combinatori di consigli :
`: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)))
Altri combinatori offrono capacità simili e il filo conduttore tra loro è che, mentre l'elenco di argomenti di una funzione può essere sostituito, troncato, esteso, ecc., Non esiste un modo apparente per i consigli di funzione di modificare l'argomento in una determinata posizione nell'elenco senza affermando qualcosa sul resto .
Nel caso in esame, sembra impossibile per l'autore del consiglio passare ansi-termsolo un nome di buffer, poiché non è possibile costruire un elenco che abbia un valore nella posizione 1 ma nulla, nemmeno nil, nella posizione 0. Nel caso generale, sembra impossibile per l'autore della consulenza modificare arbitrariamente argomenti oltre la posizione 0.
Ciò sembra sfortunato in quanto, per produrre un effetto simile, è necessario copiare e incollare il codice: in particolare, o posso copiare ansi-termil modulo interattivo ed estenderlo secondo i miei gusti, oppure posso copiarlo del ansi-termtutto ed estenderlo allo stesso modo. In entrambi i casi, ora devo ridefinire parte della distribuzione di Emacs Lisp nel mio file init, che mi sembra indesiderabile in termini sia di durata che di estetica.
La mia domanda, quindi, è: si può fare questo tipo di elenco degli argomenti con la manomissione nadvice.el? Se é cosi, come?