नए इमेकन पर फलेट के लिए सही प्रतिस्थापन क्या है?


17

मेरे पास कुछ कोड हैं जो fletकार्यों के व्यवहार को अस्थायी रूप से बदलने के लिए उपयोग करते हैं।

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

हालाँकि, Emacs का बाइट कंपाइलर एक चेतावनी देता है:

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

हालांकि, cl-fletअलग तरह से काम करता है और कुछ उपयोग मामलों के अनुरूप नहीं है, और मेरा मानना ​​है कि यह उन मामलों में से एक है।

मेरे द्वारा देखे जा सकने वाले विकल्प हैं:

  1. Emacs को चेतावनी को अनदेखा करने के लिए कहें।

  2. मेरा खुद का रोल करो flet

  3. Noflet या dflet का उपयोग करें ।

सबसे अच्छा तरीका क्या है?


3
"हालांकि, cl-flet अलग तरीके से काम करता है" । उस चेतावनी संदेश में एक दूसरा सुझाव है। ;-)
मलाबारबा

मैंने पुराने को ले लिया और बस इसका नाम बदल दिया (जैसे my-flet), और अप्रचलित चेतावनी को हटा दिया, और किसी भी पैकेज में उपयोग करें जो पहले से आवश्यक हो।
19

जवाबों:


13

आपके द्वारा उपयोग किए जाने वाले समान व्यवहार को प्राप्त करने के लिए flet, cl-letfप्रतीकों के फ़ंक्शन मान को बदलने के लिए उपयोग करें।

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

यदि आप अपना स्वयं का रोल करना चाहते हैं flet, तो आसान तरीका मैक्रो होगा जो एक cl-letfफॉर्म में फैलता है ।

संपादित करें: यह लुढ़का

(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
हालांकि, यान होडिक की मालाबारबा के लेख की टिप्पणी से यह ध्यान रखें कि: "ध्यान दें कि एमएसीएस 24.3.1 में एक सूक्ष्म बग है जो cl-letfउचित विकल्प नहीं बनाता है (आईआईआरसी, यह fletप्रतीकों के लिए काम नहीं करता है fboundpजो पहले से ही नहीं हैं )। यही कारण है कि एक पिछड़े-संगत संस्करण का fletएक सा है ... जटिल । "
फिल्स

12

Artur Malabarba ने हाल ही में इसे लिखा, अंडरस्टैंडिंग लेफ में और यह कैसे flet की जगह लेता है

letfके लिए एक उपनाम है cl-letf, और जबकि यह सबसे अधिक संभावना है कि आप क्या चाहते हैं, एक मामूली चेतावनी है, जो आर्थर बताते हैं:

दुर्भाग्य से, क्लैट-फ़्लेट मूल फ़ेल्ट के समान नहीं है - यह लेक्सिकल है, गतिशील नहीं है।

(निक का nofletपैकेज इन लाइनों के साथ विस्तारित कार्यक्षमता प्रदान करता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.