Yeni emacsen'de flet için doğru değiştirme nedir?


17

Ben bazı kodlar kullanır o fletgeçici fonksiyonların davranışını değiştirmek için.

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

Ancak, Emacs'ın bayt derleyicisi bir uyarı verir:

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'.

Ancak, cl-fletfarklı çalışır ve bazı kullanım durumlarına uymaz ve bu durumlardan biri olduğuna inanıyorum.

Görebildiğim seçenekler:

  1. Emacs'a uyarıyı bir şekilde yok saymasını söyleyin.

  2. Kendi rulo flet.

  3. Noflet veya dflet kullanın .

En iyi yaklaşım nedir?


3
"Ancak, cl-flet farklı çalışır" . Bu uyarı mesajında ​​ikinci bir öneri daha var. ;-)
Malabarba

Eski olanı aldım ve sadece yeniden adlandırdım (örneğin my-flet) ve eski uyarıyı kaldırdım ve bunu daha önce flet gerektiren herhangi bir pakette kullanın.
hukukçu

Yanıtlar:


13

Alıştığınız aynı davranışı elde etmek için flet, cl-letfsembol işlev değerini değiştirmek üzere düğmelerini kullanın .

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

Kendinizi yuvarlayacak olsanız flet, kolay yol bir cl-letfforma genişleyen makro olurdu .

Düzenle: yuvarlandı

(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
Ancak, Malabarba makalesine akılda Yann Hodique yorumuna gelen ihtar tutmak: "Emacs o notu 24.3.1 yapar ince bir hata vardır cl-letfuygun bir alternatif değildir (IIRC, bu için iş yapmaz fletzaten olmayan semboller -ing fboundp) hangisi. geriye dönük uyumlu bir sürümünün fletbiraz ... kıvrık olmasının nedeni budur . "
phils

12

Artur Malabarba bunu kısa bir süre önce, Letf'i Anlamak ve flet'in yerine nasıl koyduğunu yazdı .

letfbir takma addır cl-letfve büyük olasılıkla istediğiniz şey olsa da, Artur'ın belirttiği küçük bir uyarı vardır:

Ne yazık ki, cl-flet orijinal flet ile aynı değildir - sözel, dinamik değil.

(Nic'in nofletpaketi bu hatlarda genişletilmiş işlevsellik sağlar.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.