मुख्य बिंदु यह है कि एक फ़ंक्शन और कमांड के बीच अंतर होता है ।
Emacs लिस्प में, फ़ंक्शंस डिफ़ॉल्ट रूप से अंतःक्रियात्मक रूप से कॉल करने योग्य नहीं होते हैं। इसका मतलब है कि आप M-x
उन्हें एक कुंजी या माउस क्लिक के माध्यम से एक्सेस नहीं कर सकते या उन्हें बाँध नहीं सकते। यदि आप ऐसा करना चाहते हैं, तो आपको फ़ंक्शन को स्पष्ट रूप से घोषित करने की आवश्यकता है interactive
, जिसे आप (interactive)
शरीर में पहली पंक्ति के रूप में जोड़कर करते हैं (प्रलेखन स्ट्रिंग के बाद)। एक इंटरैक्टिव फ़ंक्शन को एक कमांड कहा जाता है यह मैनुअल में समझाया गया है: (info "(elisp) Using Interactive")
(ऑनलाइन संस्करण) ।
त्रुटि संदेश जिसे आप देखते हैं, Wrong type argument: commandp, my-function
यह इंगित कर रहा है कि आप किसी फ़ंक्शन को अंतःक्रियात्मक रूप से कॉल करने का प्रयास कर रहे हैं, लेकिन वह फ़ंक्शन एक कमांड नहीं है ।
वास्तविक त्रुटि की व्याख्या करने के लिए, पत्र p
का उपयोग अक्सर लिपि में एक विधेय या परीक्षण को इंगित करने के लिए किया जाता है। इस मामले में, Emacs my-function
यह देखने के लिए परीक्षण कर रहा है कि क्या यह परीक्षण का उपयोग करने वाला एक आदेश है commandp
। यह नहीं है, जो त्रुटि की ओर जाता है। जब भी आप गलत प्रकार के ऑब्जेक्ट का उपयोग करते हैं, तो समान त्रुटियां पॉप अप होती हैं: यदि Emacs एक स्ट्रिंग की अपेक्षा करता है और आप एक प्रतीक पास करते हैं, तो आप 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 λ