আমি কেন আমার ফাংশনটিকে একটি চাবির সাথে আবদ্ধ করতে পারি না বা তাকে এমএক্সের সাথে কল করতে পারি না?


13

আমি একটি ফাংশন লিখেছি এবং আমি এটি এমএক্সের মাধ্যমে কল করতে এবং এটি একটি কীতে আবদ্ধ করতে চাই। এটি আমার কাজ:

(defun my-function ()
    (message "This is a great function"))

যদি আমি এটির সাথে কল করার চেষ্টা করি তবে আমি M-x my-functionত্রুটিটি পাই: [no match]মিনি-বাফারে।

যদি আমি এটি কোনও কী (বা মাউস ক্লিক) এ আবদ্ধ করার চেষ্টা করি:

(global-set-key (kbd "C-c a") 'my-function)

এটি কাজ করে বলে মনে হচ্ছে তবে আমি যখন এটির সাথে কল করার চেষ্টা C-c aকরি তখন ত্রুটিটি পাই

ভুল টাইপের আর্গুমেন্ট: কমান্ডপ, মাই-ফাংশন

আমি আমার ফাংশনটি কেন ব্যবহার করতে পারি না?


5
এই বিষয়ে প্রায়শই জিজ্ঞাসিত প্রশ্নগুলির জেনেরিক প্রতিক্রিয়া হিসাবে আমি এই প্রশ্নটি স্বেচ্ছাসেবক। প্রসারিত বা নির্দ্বিধায় নির্দ্বিধায় যাইহোক প্রশ্ন এবং উত্তরটি অনুরূপ সমস্যাযুক্ত লোকদের দ্বারা আবিষ্কারযোগ্য এবং দরকারী হিসাবে বোধগম্য হয়!
টাইলার

1
টাইলার এটি করার জন্য ধন্যবাদ। দয়া করে কোনও সম্প্রদায়ের প্রশ্নে রূপান্তর করার জন্য আমি একজন মডারেটরের জন্য কিউকে পতাকাঙ্কিত করেছি।
অঙ্কিত

আমি যে বিষয়টি নিয়ে ভাবছি তা হ'ল শিরোনামটি কেবল ত্রুটির বার্তাটি উদ্ধৃত করা উচিত। এটি লোকেদের পক্ষে খুঁজে পাওয়া সহজ হতে পারে এবং এটি এমন উত্তরগুলির জন্য মঞ্জুরি দেয় যা কেবল যোগ করার সাথে হয় না interactive- যেমন, কখনও কখনও একটি লাইব্রেরির নতুন সংস্করণ থেকে একটি কমান্ড অদৃশ্য হয়ে যায়। ইমাকরা কোনও আদেশ প্রত্যাশা করে এমন কোনও প্রসঙ্গে ত্রুটি উত্থাপিত হতে পারে।
অঙ্কিত

লোকেরা যদি এখন উইকি অনুসন্ধান করে, বলুন, commandpঅন্য কিউএস যা এইটির সদৃশ হিসাবে বন্ধ করা যায় তার সন্ধান করার জন্য অনুসন্ধান করুন। প্রশ্নোত্তর পড়তে সাবধান হন, যদিও কিছু আলাদা। কিছু ক্ষেত্রে, উত্তর (এবং কিউ প্রসঙ্গে) এখানে পুনরাবৃত্তি করার উপযুক্ত হতে পারে। ইন অন্যান্য ক্ষেত্রে প্রশ্ন সম্পর্কহীন এবং Is (বন্ধ নয়) হিসেবে রাখতে হবে।
অঙ্কিত

1
@ ড্রু আমি শিরোনামে কীভাবে এটির 'বিজ্ঞাপন' করব তা নিশ্চিত ছিলাম না। কমান্ডপ ত্রুটিটি কেবল কী বাইন্ডিংগুলির সাহায্যে পপ আপ হয়, সুতরাং এমএক্সের দিক থেকে এই অংশে চলে আসা লোকেরা সংযোগটি দেখতে পাবে না। কোনও পরিষ্কার, সংক্ষিপ্ত শিরোনাম এবং একটি শিরোনাম যা সমস্ত প্রাসঙ্গিক অনুসন্ধান প্রশ্নের জন্য পপ আপ করবে তার মধ্যে সেরা ভারসাম্য কী তা নিশ্চিত নয়। আপনার পছন্দ মত টুইঙ্ক মুক্ত মনে করি!
টাইলার

উত্তর:


22

মূল বিষয়টি হ'ল একটি ফাংশন এবং কমান্ডের মধ্যে পার্থক্য রয়েছে

ইমাস লিস্পে, ফাংশনগুলি ইন্টারেক্টিভভাবে ডিফল্টরূপে কলযোগ্য হয় না। এর অর্থ আপনি 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 λ

একটি পরামর্শ আমি যুক্ত করতে চাই, এটি পরিষ্কার করুন যে আপনার উদাহরণে কাজ করার আগে আপনাকে সিএক্স সিই করা উচিতM-x my-function । ইমাক্স শিক্ষানবিস হিসাবে আমি ঠিক কী C-x C-eকরে বা কখন এটি চালানোর দরকার হয় সে সম্পর্কে আমি এখনও 100% স্পষ্ট নই , তবে এটি উপস্থিত দেখা যায় ... আপনি যখন এটি চালাবেন, তখন এটি বাফারকে পার্স করে এবং my-functionমেমরির উপরে ওভাররাইট করে কারণ যদি আমি চালাতে না কি C-x C-e M-xশেষ সময় আমি দৌড়ে থেকে রান ফাংশনC-x C-e
jrh

এটি প্রদর্শিত হবে C-x C-e যা বাফারকে মূল্যায়ন করে , মনে হয় যে কোনও একটিযুক্ত বাফারকে মূল্যায়নের ফলাফলটি defunফাংশনটি নিবন্ধভুক্ত করছে, যদিও এই নিবন্ধটি আমাকে মনে করে যে এটি কেবল ফাংশনটি চালানো উচিত, এবং এখনও মিনিবাসে প্রদর্শিত একমাত্র জিনিসটি my-function(বোঝাচ্ছে এটি ফাংশনটি ফিরিয়ে দেয়?), না This is a great function। আমার এখানে কিছু একটা ঘাটতি বলে মনে হচ্ছে।
জুন

1
আপনার মন্তব্যের জন্য ধন্যবাদ, @ জেআরএইচ। এই প্রশ্ন ও উত্তরটি এলিস্পের একটি নির্দিষ্ট দিককে সম্বোধন করছে, কীভাবে কোনও ক্রিয়াকলাপটিকে ইন্টারেক্টিভ করা যায় (অর্থাত্ কমান্ডে ফাংশনটি রূপান্তর করা)। আপনি এলিজপের আরও মৌলিক দিকগুলি সম্পর্কে জিজ্ঞাসা করছেন এবং এই প্রশ্নের ক্ষেত্রের বাইরে। আমি ইমাস লিস্প ইন্ট্রোর মাধ্যমে কাজ করার পরামর্শ দিচ্ছি। আপনি একটি ফাংশন সংজ্ঞা মূল্যায়নের মধ্যে পার্থক্য সম্পর্কে বিভ্রান্ত বলে মনে হচ্ছে, যা (পুনরায়) একটি ফাংশন সংজ্ঞায়িত করে কিন্তু আসলে এটি কল করে না, এবং ফাংশনটি কল করে যা ফাংশন কোড চালায়।
টাইলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.