আপনার প্রয়োজনীয় সমস্ত তথ্য অন্তর্ভুক্ত করা হয়েছে 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
। কিছু বিকাশকারী কখনও কখনও ডকুমেন্টিং ওভার বিকাশ পছন্দ করে। ;-) এটি গুরুত্বপূর্ণ যে ইম্যাক্স নিজেই নথিভুক্ত করে।