আমি কীভাবে একটি নামবিহীন পরামর্শ সরিয়ে ফেলতে পারি?


12

আমি একটি অনুষ্ঠানে কিছু পরামর্শ যোগ করতে মজা পাচ্ছিলাম:

(advice-add 'executable-find :around
            (lambda (f &rest args)
              (apply g args)))
               ;;;   ^

আচ্ছা, একটি টাইপো এটি স্থির করে আবার কোডের উপরে মূল্যায়ন করা। তবে এখন আমার উভয়ই আছে, সেই ফাংশনটি সম্পর্কে "সংশোধন" এবং "ভাঙা" পরামর্শ।

আমি কীভাবে এগুলি থেকে মুক্তি পাব? প্রদত্ত যা advice-removeফাংশন অবজেক্ট বা আশেপাশের পরামর্শ প্রয়োজন (যা এখানে খালি আছে)?

(স্পষ্টতই আমি কেবল প্রস্থান এবং পুনরায় চালু করতে পারি, তবে অন্য উপায় আছে, তাই না?)

উত্তর:


7

আপনি advice-removeএকই ল্যাম্বডা এক্সপ্রেশন দিয়ে কল করতে পারেন , অর্থাত্, advice-addসঙ্গে প্রতিস্থাপন advice-removeএবং মুছুন :around, তারপর C-x C-e


এইটা কাজ করে! আমি ভেবেছিলাম এটি হবে না, আমি ধরে নিয়েছি যে (1) প্রতিটি বার আপনি যখন ল্যাম্বদা ফর্মটি মূল্যায়ন করেন তখন আপনি eqআগের ফাংশনগুলির চেয়ে একটি নতুন ফাংশন পাবেন , (২) পরামর্শ-অপসারণটি পরামর্শগুলির সাথে এটি ফাংশনটির সাথে তুলনা করবে যতক্ষণ না এটি পাওয়া যায় এক যে eqএটি এবং যে অপসারণ, (3) এমনকি যদি পরামর্শ-সরানোর একটি ভিন্ন পরীক্ষা ব্যবহৃত, মত equal, এটা এখনও কাজ না would কারণ একটি ল্যামডা ফর্মের বিভিন্ন মূল্যায়ন করতে চাই না কাজে equalএকে অপরকে। দেখা যাচ্ছে (1) সঠিক, তবে (2) এবং (3) ভুল: পরামর্শ-অপসারণ ব্যবহারগুলি equal, এবং একই lambdaবার দুবার মূল্যায়ন করলে equalফলাফল আসে!
ওমর

আমি যখন প্রশ্নটি জিজ্ঞাসা করি তখন আমি কোনও উত্তর ফিরে পাইনি Not আমি আপনাকে বেছে নিই কারণ এটি আইএমওর পরিস্থিতিতে সবচেয়ে সহায়ক।
ড্যানিয়েল জোর

11

রয়েছে advice-mapc, যা প্রতিটি ফাংশন প্রয়োগ করে কিছু ফাংশন সমস্ত পরামর্শ উপর এক পুনরাবৃত্তি করা যাক। এটির সাহায্যে সমস্ত পরামর্শ সরিয়ে ফেলা সহজ:

(advice-mapc
  (lambda (adv prop)
    (advice-remove 'executable-find adv))
  'executable-find)

এটি কেবলমাত্র পরামর্শগুলি সরিয়ে ফেলার জন্য বাড়ানো যেতে পারে যাগুলির সাথে nameদ্বিতীয় ( props) যুক্তি (যা একটি বিকল্প রয়েছে) সন্ধানের দ্বারা সম্পত্তি নেই, যাদের কী সম্পর্কিত কিছু নেই name


হ্যাঁ. এবং একটি ব্যবহার করা nameসরানো সহজ করে তোলে।
ড্র

1

ইন্টারেক্টিভভাবে এটি করতে সহায়তা করার জন্য এখানে কিছু কোড রয়েছে।

এটি দুটি ফাংশন সংজ্ঞায়িত করে। প্রথম ফাংশন প্রদত্ত প্রতীকের সমস্ত পরামর্শের তালিকা পায়, দ্বিতীয় ফাংশনটি ইন্টারেক্টিভভাবে একটি প্রতীক এবং সেই প্রতীকটির জন্য পরামর্শ চায়, তারপরে পূর্বেরটিকে পরে সরিয়ে দেয়। এটি সম্পূর্ণ হওয়ার সাথে সাথে ল্যাম্বডা এক্সপ্রেশনটি কপি করার চেয়ে সহজ (আমার কাছে) me

(defun yf/advice-list (symbol)
  (let (result)
    (advice-mapc
     (lambda (ad props)
       (push ad result))
     symbol)
    (nreverse result)))

(defun yf/kill-advice (symbol advice)
  "Kill ADVICE from SYMBOL."
  (interactive (let* ((sym (intern (completing-read "Function: " obarray #'yf/advice-list t)))
                      (advice (let ((advices-and-their-name
                                     (mapcar (lambda (ad) (cons (prin1-to-string ad)
                                                                ad))
                                             (yf/advice-list sym))))
                                (cdr (assoc (completing-read "Remove advice: " advices-and-their-name nil t)
                                            advices-and-their-name)))))
                 (list sym advice)))
  (advice-remove symbol advice))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.