Sebagai lanjutan dari jawaban untuk pertanyaan lain tentang sistem saran baru :
Dalam gaya lama advice.el
, dimungkinkan untuk memanipulasi anggota individu dari daftar argumen fungsi yang disarankan, tanpa membuat pernyataan mengenai anggota yang tidak dimanipulasi. Misalnya, saran berikut:
(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))
memungkinkan ketentuan (opsional) argumen nama penyangga untuk ansi-term
panggilan, sementara ansi-term
masih akan mendapatkan argumen pertamanya dengan mendorong sesuai dengan bentuk interaktifnya sendiri.
(Untuk referensi di kemudian hari, ansi-term
tandatangannya adalah (PROGRAM &optional BUFFER-NAME)
, dan formulir interaktifnya meminta PROGRAM dengan beberapa kemungkinan default, tetapi tidak melakukan apa pun mengenai BUFFER-NAME.)
Saya tidak yakin apakah ini mungkin masuk atau tidak nadvice.el
. Jika ya, saya tidak yakin bagaimana hal itu dapat dilakukan. Saya telah menemukan beberapa cara untuk mengganti daftar argumen fungsi yang disarankan.
Misalnya, dari * info * (elisp) Kombinator saran :
`: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)))
Combinator lain memberikan kemampuan yang serupa, dan utas umum di antara mereka adalah bahwa, sementara daftar argumen fungsi dapat diganti, dipotong, diperluas, dan lain-lain, tidak ada cara yang jelas bagi saran fungsi untuk memodifikasi argumen pada posisi tertentu dalam daftar tanpa menegaskan apa pun tentang sisanya .
Dalam kasus yang sedang dibahas, tampaknya tidak mungkin bagi penulis saran untuk memberikan ansi-term
hanya nama penyangga, karena tidak mungkin untuk membuat daftar yang memiliki nilai di posisi 1 tetapi tidak ada, bahkan tidak nil
, di posisi 0. Dalam kasus umum, Tampaknya mustahil bagi penulis saran untuk secara sewenang-wenang mengubah argumen di luar posisi 0.
Ini sepertinya disayangkan bahwa, untuk menghasilkan efek yang serupa, perlu menyalin kode tempel: secara spesifik, saya dapat menyalin ansi-term
formulir interaktif dan memperluasnya sesuai selera saya, atau saya dapat menyalin ansi-term
semuanya dan memperluasnya juga. Dalam kedua kasus tersebut, sekarang saya harus mendefinisikan kembali bagian dari distribusi Emacs Lisp dalam file init saya, yang menurut saya tidak diinginkan dalam hal daya tahan dan estetika.
Pertanyaan saya adalah: Dapatkah daftar argumen semacam ini diselesaikan nadvice.el
? Jika ya, bagaimana caranya?