আপনার প্রয়োজনীয় সমস্ত তথ্য অন্তর্ভুক্ত করা হয়েছে C-h f add-functionযার অন্তর্নিহিত প্রক্রিয়াটি বর্ণনা করে advice-add।
নতুন পরামর্শ ব্যবস্থাটি মূলত সারণিতে বর্ণিত ফাংশন দ্বারা কোনও ক্রিয়নের বর্তমান সংজ্ঞাটি পরিবর্তনের মতো কাজ করে যা
C-h f add-functionআপনার WHERE
যুক্তির পছন্দ অনুসারে , কোন উত্স ফাইলটিতে কী আচরণকে সংজ্ঞায়িত করা হয়েছে তা অনুসরণ করার জন্য কেবল ক্লিনার।
:aroundবিকল্প সহ একটি উদাহরণ
সর্বাধিক সাধারণ কেসটি :aroundবিকল্প, তাই আমি তার জন্য একটি উদাহরণ দিই। ( WHEREসম্ভব হলে ডেডিকেটেড প্যারামিটারগুলি ব্যবহার করা আরও ভাল তবে আপনি প্রতিটি অন্যকে একটি সমতুল্য :aroundফাংশন দ্বারা প্রতিস্থাপন করতে পারেন
)।
একটি উদাহরণ হিসাবে, আসুন আমরা আপনাকে কিছু ব্যবহার ডিবাগ করতে চাই find-file
এবং printপ্রতিটি বার যখন এটি বলা হয় তখন এর যুক্তি তালিকার তালিকায় যেতে চাই । আপনি লিখতে পারে
(defun my-find-file-advice-print-arguments (old-function &rest arguments)
"Print the argument list every time the advised function is called."
(print arguments)
(apply old-function arguments))
(advice-add #'find-file :around #'my-find-file-advice-print-arguments)
এই নতুন বাস্তবায়নের সাথে, পরামর্শের প্রয়োজনীয় সমস্ত কিছুই আর্গুমেন্ট হিসাবে পাস করা হবে। ad-get-argsঅযৌক্তিক হয়ে ওঠে, কারণ আর্গুমেন্টগুলি সাধারণ ফাংশন আর্গুমেন্ট হিসাবে যুক্ত ফাংশনটিতে পৌঁছে দেওয়া হয় (
WHEREযুক্তিগুলির জন্য যার অর্থ এটি বোঝায়)। পরামর্শ তত্ক্ষণাত ফাংশন এবং আর্গুমেন্ট ad-do-itহিসাবে অকারণে পরিণত হয় :around, তাই (ad-do-it)ফর্ম দ্বারা প্রতিস্থাপিত হয়
(apply old-function arguments)
অথবা আপনি যখন যুক্তিগুলির নাম দিয়েছেন
(funcall old-function first-arg second-arg)
জড়িত কোনও যাদু ফর্ম না থাকায় এটি পরিষ্কার। আর্গুমেন্টগুলি সংশোধন করা সহজভাবে পরিবর্তিত মানগুলিতে পাস করার মাধ্যমে ঘটে OLD-FUNCTION।
অন্যান্য WHEREমান
এর ডক্ট্রিংয়ে add-functionসমস্ত পরামর্শের জায়গাগুলির (বা " সংযুক্তকারী ") এর একটি সারণী রয়েছে এবং সেগুলির সমতুল্য এবং পরামর্শযুক্ত ফাংশনের lambdaসমতুল্য আচরণের ক্ষেত্রে কার্যকারিতা ব্যাখ্যা করে :
`:before' (lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
`:after' (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
`:around' (lambda (&rest r) (apply FUNCTION OLDFUN r))
`:override' (lambda (&rest r) (apply FUNCTION r))
`:before-while' (lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
`:before-until' (lambda (&rest r) (or (apply FUNCTION r) (apply OLDFUN r)))
`:after-while' (lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
`:after-until' (lambda (&rest r) (or (apply OLDFUN r) (apply FUNCTION r)))
`:filter-args' (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
`:filter-return'(lambda (&rest r) (funcall FUNCTION (apply OLDFUN r)))
(cited from `C-h f add-function')
যেখানে FUNCTION হ'ল পরামর্শ ফাংশন এবং পরামর্শ যুক্ত করা ফাংশন ওল্ডফুন। এগুলি একবারে বোঝার চেষ্টা করবেন না, কেবল এমন একটি WHEREপ্রতীক নির্বাচন করুন যা উপযুক্ত মনে হয় এবং সেটিকে বোঝার চেষ্টা করুন।
বা শুধু ব্যবহার :around। যতদূর আমি সমস্ত কিছুর জন্য বিশেষায়িত WHEREগুলি ব্যবহারের একমাত্র সুবিধাটি বলতে পারি :aroundযে আপনি C-h f ADVISED-FUNCTION
পরামর্শের ডক্ট্রাস্টিং পড়ার আগে সন্ধান করা থেকে কিছুটা আরও তথ্য পাবেন। আপনি যদি পরামর্শটি সহ কোডটি প্রকাশের পরিকল্পনা না করেন তবে সম্ভবত এটি কোনও বিষয় নয়।
নামকরণ পরামর্শ ফাংশন
আমি নামযুক্ত ফাংশনগুলি পরামর্শ হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটি অনেকগুলি সুবিধা দেয় (এর মধ্যে কয়েকটি হুকের জন্য নামযুক্ত ফাংশনগুলি ব্যবহারের ক্ষেত্রেও প্রয়োগ করা হয়):
এটি C-h f find-fileহিসাবে প্রদর্শিত হয়
:around advice: `my-find-file-advice-print-arguments'
পরামর্শ ফাংশনটির সংজ্ঞাটির সাথে লিঙ্ক করা, এতে যথারীতি ফাইলটির লিঙ্ক থাকে যেখানে এটি সংজ্ঞায়িত হয়েছিল। যদি পরামর্শটি কোনও lambdaফর্ম হিসাবে সরাসরি ফর্ম হিসাবে সংজ্ঞায়িত করা advice-add
হত তবে ডকস্ট্রিংকে ইনলাইন (দীর্ঘ ডক্টাস্টিংগুলির জন্য একটি জগাখিচুড়ি?) প্রদর্শিত হবে এবং এটি সংজ্ঞায়িত হয়েছিল এমন কিছুই ইঙ্গিত দেয় না।
আপনি পরামর্শটি সরাতে পারেন
(advice-remove #'find-file #'my-find-file-advice-print-arguments)
আপনি advice-addপুরাতন সংস্করণটিকে সক্রিয় রাখতে পুনরায় পরিচালনা বা ঝুঁকি না নিয়ে পরামর্শের সংজ্ঞাটি আপডেট করতে পারেন ( advice-addপরিবর্তিতের সাথে চালানো lambdaনতুন পরামর্শ হিসাবে স্বীকৃত হবে,
পুরানোটির
আপডেট হিসাবে নয়)।
সাইড মন্তব্য#'function স্বরলিপি মূলত সমতূল্য
'functionছাড়া এটি (যেমন টাইপস কারণে) সাহায্য বাইট কম্পাইলার ফাংশন নাম হিসেবে শনাক্ত প্রতীক এবং এইভাবে অনুপস্থিত ফাংশন চিহ্নিত করতে।
M-x report-emacs-bug। কিছু বিকাশকারী কখনও কখনও ডকুমেন্টিং ওভার বিকাশ পছন্দ করে। ;-) এটি গুরুত্বপূর্ণ যে ইম্যাক্স নিজেই নথিভুক্ত করে।