মূল বিষয়টি হ'ল একটি ফাংশন এবং কমান্ডের মধ্যে পার্থক্য রয়েছে ।
ইমাস লিস্পে, ফাংশনগুলি ইন্টারেক্টিভভাবে ডিফল্টরূপে কলযোগ্য হয় না। এর অর্থ আপনি M-x
কী বা মাউস ক্লিকের মাধ্যমে এগুলি অ্যাক্সেস করতে বা তাদেরকে আবদ্ধ করতে পারবেন না । যদি আপনি এটি করতে চান তবে আপনাকে স্পষ্টভাবে ফাংশনটি হ'ল ঘোষণা করতে হবে interactive
যা আপনি (interactive)
শরীরের প্রথম লাইন হিসাবে একটি ফর্ম যুক্ত করে (ডকুমেন্টেশনের স্ট্রিং অনুসরণ করে) করেন। একটি ইন্টারেক্টিভ ফাংশনকে কমান্ড বলা হয় এটি ম্যানুয়ালটিতে ব্যাখ্যা করা হয়েছে: (info "(elisp) Using Interactive")
(অনলাইন সংস্করণ) ।
আপনি যে ত্রুটি বার্তাটি দেখতে পাচ্ছেন Wrong type argument: commandp, my-function
তা ইঙ্গিত করছে যে আপনি ইন্টারেক্টিভভাবে কোনও ফাংশন কল করার চেষ্টা করছেন, কিন্তু সেই ফাংশনটি কোনও আদেশ নয় ।
প্রকৃত ত্রুটিটি ব্যাখ্যা করার জন্য, চিঠিটি p
প্রায়শই লিস্পে একটি ভবিষ্যদ্বাণী বা পরীক্ষা নির্দেশ করতে ব্যবহৃত হয়। এই ক্ষেত্রে, ইমাকস my-function
পরীক্ষাটি ব্যবহার করে এটি কোনও কমান্ড কিনা তা পরীক্ষা করে দেখছে commandp
। এটি নয়, যা ত্রুটির দিকে পরিচালিত করে। আপনি যখনই ভুল ধরণের কোনও অবজেক্ট ব্যবহার করেন তেমনই ত্রুটিগুলি পপ আপ হয়: যদি ইমাক্স কোনও স্ট্রিংয়ের প্রত্যাশা করে এবং আপনি কোনও চিহ্নটি পাস করেন stringp
, উদাহরণস্বরূপ আপনি একটি রেফারেন্স দেখতে পাবেন ।
জিজ্ঞাসা করা প্রশ্নের উত্তর দেওয়ার জন্য আপনাকে (interactive)
সংজ্ঞাটিতে লাইন যুক্ত করতে হবে:
(defun my-function ()
(interactive)
(message "This is a great function"))
একটা হয় অনেক জন্য বিকল্প interactive
ফর্ম, আপনার ফাংশন তথ্য ক্ষণস্থায়ী উপায়ে সব ধরনের সমর্থন করে। সমস্ত বিবরণের জন্য ম্যানুয়াল পরীক্ষা করুন।
এই প্রসঙ্গে কীবোর্ড ম্যাক্রোগুলি একটি বিশেষ কেস। একটি কীবোর্ড ম্যাক্রো ইনপুট ইভেন্টগুলির ক্রম যা স্ট্রিং হিসাবে উপস্থাপিত হয়। কীবোর্ড ম্যাক্রোগুলি কমান্ডগুলির মতো আচরণ করে, তাই আপনি কোনও interactive
ঘোষণা যুক্ত করার চিন্তা না করেই কীগুলিতে আবদ্ধ করতে পারেন । উদাহরণস্বরূপ, নিম্নলিখিতটিতে:
(global-set-key (kbd "C-c l") "λ")
"λ"
একটি কীবোর্ড ম্যাক্রো, তাই আমরা এটিকে C-c l
কোনও সমস্যা ছাড়াই বাঁধতে পারি । যদি আমরা কোনও ফাংশন দিয়ে একই জিনিসটি করার চেষ্টা করি তবে আমাদের অবশ্যই ফাংশনটি সংজ্ঞায়িত করতে হবে interactive
:
(global-set-key (kbd "C-c k")
(lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function
(global-set-key (kbd "C-c m")
(lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ