İtibaren ardından yeni danışma sistemi hakkında başka soruya bir cevap :
Eski tarzda advice.el
, tavsiye edilen bir işlevin argüman listesinin bireysel üyelerini, manipüle edilmeyen bu üyelerle ilgili herhangi bir iddiada bulunmaksızın manipüle etmek mümkün oldu. Örneğin, aşağıdaki öneriler:
(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
aramaya bir arabellek adı bağımsız değişkeninin (isteğe bağlı) sağlanmasına izin verirken ansi-term
, yine de ilk bağımsız değişkenini kendi etkileşimli biçimine göre sorarak elde eder.
(Daha sonra başvurmak için, ansi-term
imzasıdır (PROGRAM &optional BUFFER-NAME)
ve etkileşimli formu birkaç olası varsayılan ile PROGRAM ister, ancak BUFFER-NAME ile ilgili hiçbir şey yapmaz.)
Bunun mümkün olup olmadığından emin değilim nadvice.el
. Eğer öyleyse, nasıl yapılabileceğinden emin değilim. Tavsiye edilen bir işlevin argüman listesini değiştirmek için birkaç yol buldum .
Örneğin, * info * (elisp) 'den Tavsiye birleştiricileri :
`: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)))
Diğer birleştiriciler benzer yetenekler sağlar ve aralarındaki ortak iş parçacığı, bir işlevin bağımsız değişken listesinin değiştirilebileceği, kesilebileceği, genişletilebileceği, ancak işlev önerisinin bağımsız değişkenleri listede belirli bir konumda değiştirmeden görünür bir yolu olmadığıdır. geri kalanı hakkında bir şey iddia etmek .
Tartışılan durumda, tavsiye yazarının ansi-term
sadece bir arabellek adı geçmesi imkansız görünmektedir , çünkü konum 1'de bir değeri olan, ancak nil
0 konumunda bile hiçbir şey olmayan bir liste oluşturmak mümkün değildir. tavsiye yazarının 0 konumundan ötesindeki argümanları keyfi olarak değiştirmesi imkansız görünmektedir.
Bu, benzer bir etki üretmek için kodu kopyalayıp yapıştırmak gerektiğinde talihsiz görünüyor: özellikle, ya ansi-term
etkileşimli formunu kopyalayabilir ve zevkime göre genişletebilirim ya da ansi-term
tamamen kopyalayıp aynı şekilde genişletebilirim. Her iki durumda da, init dosyamdaki Emacs Lisp dağıtımının bir kısmını yeniden tanımlamalıyım, bu da hem dayanıklılık hem de estetik açısından beni istenmeyen bir yere çarpıyor.
O zaman sorum şu: Bu tür bir tartışma listesi yönetimi ile yapılabilir nadvice.el
mi? Öyleyse nasıl?