নতুন ইমাসসেনে ফ্লেটের সঠিক প্রতিস্থাপন কী?


17

আমার কিছু কোড রয়েছে যা fletঅস্থায়ীভাবে ফাংশনগুলির আচরণ পরিবর্তন করতে ব্যবহার করে।

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

তবে, ইমাসস 'বাইট সংকলক একটি সতর্কতা দেয়:

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. ইমাসকে কোনওভাবে সতর্কতা উপেক্ষা করতে বলুন।

  2. আমার নিজের রোল flet

  3. নফলেট বা ডিফলেট ব্যবহার করুন ।

সেরা পন্থা কি?


3
"তবে, ক্ল-ফ্লেট আলাদাভাবে কাজ করে" । সেই সতর্কতা বার্তায় দ্বিতীয় পরামর্শ রয়েছে। ;-)
মালবারবা

আমি my-fletপুরানোটি নিয়ে গিয়ে কেবল এটির নামকরণ করেছি (উদাঃ, ) এবং অপ্রচলিত সতর্কতাটি সরিয়ে নিয়েছি এবং এটি কোনও প্যাকেজে আগে ফ্লেটের প্রয়োজন হয়।
আইনজীবি

উত্তর:


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

আর্টুর মালবারবা সম্প্রতি এগুলি লিখেছিলেন, বোঝার জন্য লেফ এবং কীভাবে এটি ফলকে প্রতিস্থাপন করে

letfcl-letfএটির জন্য একটি নাম এবং এটি সম্ভবত আপনি যা চান, সেখানে একটি ছোটখাটো সতর্কতা রয়েছে যা আর্তুর বলেছে:

দুর্ভাগ্যক্রমে, ক্ল-ফ্লেট মূল ফ্লেটের সাথে একরকম নয় — এটি লেক্সিকাল, গতিশীল নয়।

(নিকের nofletপ্যাকেজ এই লাইনগুলির সাথে বর্ধিত কার্যকারিতা সরবরাহ করে))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.