Tiếp theo từ một câu trả lời cho một câu hỏi khác về hệ thống tư vấn mới :
Theo kiểu cũ advice.el
, có thể thao túng các thành viên riêng lẻ trong danh sách đối số của hàm được khuyên, mà không đưa ra bất kỳ xác nhận nào về các thành viên đó không bị thao túng. Ví dụ: lời khuyên sau:
(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))
cho phép cung cấp (tùy chọn) đối số tên đệm cho ansi-term
cuộc gọi, trong khi ansi-term
vẫn sẽ có được đối số đầu tiên bằng cách nhắc theo hình thức tương tác của chính nó.
(Để tham khảo sau này, ansi-term
chữ ký (PROGRAM &optional BUFFER-NAME)
của nó là và biểu mẫu tương tác của nó nhắc PROGRAM với một số giá trị mặc định có thể có, nhưng không có gì liên quan đến BUFFER-NAME.)
Tôi không chắc liệu điều này có khả thi hay không nadvice.el
. Nếu có, tôi không chắc nó có thể được thực hiện như thế nào. Tôi đã tìm thấy một vài cách để thay thế danh sách đối số của hàm được khuyên.
Ví dụ: từ * thông tin * (elisp) Bộ kết hợp lời khuyên :
`: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)))
Các tổ hợp khác cung cấp các khả năng tương tự và chủ đề chung trong số đó là, trong khi danh sách đối số của hàm có thể được thay thế, cắt ngắn, mở rộng, et al, không có cách nào rõ ràng để tư vấn chức năng sửa đổi đối số tại một vị trí nhất định trong danh sách mà không có khẳng định bất cứ điều gì về phần còn lại của nó .
Trong trường hợp đang thảo luận, tác giả lời khuyên ansi-term
chỉ có thể chuyển tên đệm, vì không thể tạo danh sách có giá trị ở vị trí 1 nhưng không có gì, thậm chí không nil
ở vị trí 0. Trong trường hợp chung, tác giả lời khuyên dường như không thể tự ý sửa đổi các đối số ngoài vị trí 0.
Điều này có vẻ đáng tiếc ở chỗ, để tạo ra hiệu ứng tương tự, cần phải sao chép-dán mã: cụ thể, tôi có thể sao chép ansi-term
hình thức tương tác của mình và mở rộng nó theo sở thích của mình, hoặc tôi có thể sao chép ansi-term
hoàn toàn và mở rộng tương tự. Trong cả hai trường hợp, bây giờ tôi phải xác định lại một phần của bản phân phối Emacs Lisp trong tệp init của tôi, điều này khiến tôi không mong muốn về cả độ bền và tính thẩm mỹ.
Sau đó, câu hỏi của tôi là: Loại danh sách đối số này có thể được thực hiện với nadvice.el
? Nếu vậy thì thế nào?