Sự thay thế chính xác cho flet trên emacsen mới là gì?


17

Tôi có một số mã sử dụng fletđể tạm thời thay đổi hành vi của các chức năng.

;; prevent changing the window
(flet ((pop-to-buffer (buffer &rest args)
                      (switch-to-buffer buffer)))
   (compilation-next-error-function n reset))

Tuy nhiên, trình biên dịch byte của Emacs đưa ra cảnh báo:

In ag/next-error-function:
ag.el:103:7:Warning: `flet' is an obsolete macro (as of 24.3); use either
    `cl-flet' or `cl-letf'.

Tuy nhiên, cl-flethoạt động khác nhau và không phù hợp với một số trường hợp sử dụng và tôi tin rằng đây là một trong những trường hợp đó.

Các tùy chọn tôi có thể thấy là:

  1. Nói với Emacs bỏ qua cảnh báo bằng cách nào đó.

  2. Cuộn của riêng tôi flet.

  3. Sử dụng noflet hoặc dflet .

Đâu là cách tiếp cận lí tưởng nhất?


3
"Tuy nhiên, cl-flet hoạt động khác nhau" . Có một đề nghị thứ hai trong thông điệp cảnh báo đó. ;-)
Malabarba

Tôi lấy cái cũ và chỉ đổi tên nó (ví dụ, my-flet) và loại bỏ cảnh báo lỗi thời, và sử dụng nó trong bất kỳ gói nào trước đây yêu cầu flet.
luật

Câu trả lời:


13

Để có cùng hành vi mà bạn đã quen với flet, hãy sử dụng cl-letfđể thay đổi giá trị hàm biểu tượng.

(cl-letf (((symbol-function 'pop-to-buffer)
           (lambda (buffer &rest _) (switch-to-buffer buffer))))
  (compilation-next-error-function n reset))

Nếu bạn tự cuộn flet, cách dễ dàng sẽ là macro mở rộng cl-letfthành biểu mẫu.

Chỉnh sửa: cuộn nó

(defmacro myflet (bindings &rest body)
  "Works like the old `flet'. Does not validate form structure."
  (declare (indent defun))
  `(cl-letf ,(mapcar (lambda (binding)
                       `((symbol-function ',(car binding))
                         (lambda ,(cadr binding) ,@(cddr binding))))
                     bindings)
     ,@body))

(myflet ((+ (&rest args) (apply '- args)))
  (+ 10 3 2)) ;; => 5

3
Tuy nhiên, hãy ghi nhớ lời cảnh báo từ nhận xét của Yann Hodique cho bài viết của Malabarba: "lưu ý rằng Emacs 24.3.1 có một lỗi tinh vi cl-letfkhông phải là một giải pháp thay thế phù hợp (IIRC, nó không hoạt động đối với fletcác biểu tượng chưa có fboundp). là lý do tại sao một phiên bản tương thích ngược của fletmột chút ... phức tạp . "
phils

12

Artur Malabarba đã viết điều này gần đây, trong Tìm hiểu về letf và cách nó thay thế flet .

letflà một bí danh cho cl-letf, và trong khi đó rất có thể là những gì bạn muốn, có một cảnh báo nhỏ mà Artur chỉ ra:

Thật không may, cl-flet không giống với flet ban đầu. Nó là từ vựng, không năng động.

( nofletGói của Nic cung cấp chức năng mở rộng dọc theo các dòng này.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.