Tính năng tư vấn cho phép sửa đổi hành vi của một chức năng trên toàn cầu. Một định nghĩa lời khuyên có thể thực hiện cuộc gọi đến chức năng ban đầu.
(defadvice foo
(around foo-bar activate compile)
"Always set `qux' to t when running `foo'."
(let ((qux t))
ad-do-it))
Các cl
gói cung cấp các flet
macro để ghi đè lên một chức năng tại địa phương.
(defun foo ()
"global")
(flet ((foo ()
"local"))
(some-code-that-calls-foo))
Điều đó không cho phép tham chiếu đến foo
chức năng ban đầu . Nếu ghi đè cục bộ cần gọi hàm gốc thì sao?
(defun foo ()
"global")
(flet ((foo ()
(concat (foo) "+local")))
;; this will cause an infinite loop when (foo) is called
(some-code-that-calls-foo))
Cách tiếp cận đơn giản này không hoạt động, vì lý do chính đáng: (foo)
là một cuộc gọi đệ quy đến định nghĩa địa phương.
Cách nào không phức tạp để ghi đè cục bộ một hàm, cho phép gọi hàm gốc từ mã ghi đè?
Ứng dụng: khỉ vá một số mã hiện có, trong trường hợp foo
không nên bật lại trên toàn cầu, nhưng mã cần phải gọi mã gốc. Đây là ví dụ mới nhất mà tôi mong muốn:
(defadvice TeX-master-file
(around TeX-master-file-indirect-buffer activate compile)
"Support indirect buffers."
(flet ((buffer-file-name (&optional buffer)
(<global buffer-file-name> (buffer-base-buffer buffer))))
ad-do-it)))
Tôi muốn rebind buffer-file-name
tại địa phương, và gọi bản gốc buffer-file-name
. Ok, trong trường hợp cụ thể này, có một cách giải quyết, đó là sử dụng buffer-file-name
biến. Nhưng điểm của câu hỏi của tôi ở đây là kỹ thuật chung. Làm cách nào tôi có thể liên kết một hàm (ở đây buffer-file-name
) cục bộ nhưng gọi định nghĩa toàn cục từ định nghĩa lại của tôi?
Cái này là của tôi .emacs
, cái mà tôi tiếp tục làm việc trong Emacs 19.34, vì vậy các giải pháp yêu cầu Emacs 24.4 đã được đưa ra. Mặc dù vậy, tôi thích các giải pháp đối phó với ràng buộc từ vựng một cách sạch sẽ - nhưng vá khỉ vốn dĩ là về ràng buộc động.
cl-letf
nó có sẵn trong emacs 24.3 trở về trước, nhưng đây là một câu hỏi và trả lời liên quan: emacs.stackexchange.com/a/16495/221