2012-03-30 16 views
15

मैं उपयोगकर्ता "कस्टमाइज़ करें" Emacs बैकएंड में अपने स्वयं के आदेश चुनें (और आम तौर पर एक चर में एक निष्पादन योग्य प्रपत्र नाम की दुकान करने में सक्षम हो) करने की अनुमति चाहते हैं, लेकिन यह काम नहीं करता:elisp में, मैं एक चर में एक फ़ंक्शन कैसे डालूं?

(defun dumb-f() 
    (message "I'm a function")) 

    (defvar my-function "dumb-f") 

    (my-function) 
    ==> Debugger entered--Lisp error: (invalid-function "dumb-f") 

    (setq my-function 'dumb-f) 

    (my-function) 
    ==> Debugger entered--Lisp error: (invalid-function "dumb-f") 

मैंने कोशिश की विभिन्न रूपों, लेकिन अभी भी कोई भाग्य नहीं है, और मुझे इसके लिए खोज करने में कठिनाई हो रही है, मुझे कार्यों और चर के बारे में परिणामों के किलोगेज मिलते हैं, लेकिन बाद में किसी को भी कैसे रखा जाए ..?

उत्तर

24

नोट। जब आप किसी प्रतीक का मूल्यांकन करते हैं, तो आपको मान मिलता है। जब आप उस प्रतीक से शुरू होने वाली सूची का मूल्यांकन करते हैं, तो आप इसे फ़ंक्शन पर कॉल करते हैं। यही कारण है कि आप एक ही नाम के साथ एक चर और एक समारोह हो सकता है। और के रूप में ryuslash आपको दिखाता है कि एक मूल्य के रूप में कोई फ़ंक्शन असाइन और funcall के माध्यम से यह कॉल कर सकते हैं - -

असाइनमेंट मूल्य सेट हो जाएगा (जैसे let, setq, defvar, defcustom, आदि ...) के अधिकांश प्रकार लेकिन वहाँ भी कर रहे हैं एक प्रतीक के समारोह सेल सीधे fset (या flet, defalias, आदि) का उपयोग कर

(fset 'my-function 'dumb-f) 
(my-function) 

को आवंटित करने के लिए अपने मामले मैं ryuslash के जवाब का प्रयोग करेंगे (सिवाय आप defcustom बजाय defvar उपयोग करने के लिए करता है, तो आप यह चाहते जरूरत तरीकोंके माध्यम से उपलब्ध होना चाहिए)।

इसके अलावा, "मुझे इसके लिए कठिन समय चल रहा है"; हमेशा याद रखें कि Emacs स्वयं-दस्तावेज है, और अन्य चीजों के साथ इंडेक्स (वास्तव में, एक से अधिक मैनुअल, वास्तव में) के साथ एक अच्छा मैनुअल पूर्ण है। इसलिए यदि Google आपका पहला बंदरगाह बनी हुई है, तो यह भी नहीं होना चाहिए कि आप जो भी खोज रहे हैं उसे प्राप्त नहीं कर सकते हैं। Elisp मैनुअल के सामग्री पृष्ठ से आप "फ़ंक्शन" और फिर "कॉलिंग फ़ंक्शंस" पर नेविगेट कर सकते हैं और आपको लगभग funcall लगभग तुरंत बताया जाएगा।

+1

आप रोल पर हैं। महान जवाब –

+0

मेरे उदाहरण बुरी तरह से चुना गया था, खेद: मैं अनुकूलित करने के लिए, कहते हैं उपयोगकर्ता अपने मेल प्रोग्राम चुनते हैं, तो पसंद करते हैं का उपयोग करना चाहते:। '(मेरे मेल-कार्यक्रम 'gnus" "मेल क्लाइंट आदेश defcustom उदाहरण : wl " : टाइप करें 'स्ट्रिंग : समूह' मेल-बग्जर)' मुझे निष्पादित नहीं किया जा सकता (मेरा मेल-प्रोग्राम) ..? – yPhil

+1

तो आपको ''स्ट्रिंग' की बजाय' 'टाइप' फ़ंक्शन 'का उपयोग करना चाहिए,' 'gnus' 'के बजाय' gnus' 'के डिफ़ॉल्ट मान के साथ, और फिर आप '(funcall my-mail-program)' । सुनिश्चित करें कि आप एक स्ट्रिंग और प्रतीक के बीच अंतर को समझते हैं। – phils

15

एक चर में संग्रहीत एक समारोह को चलाने के लिए कि Emacs लिस्प में, प्रतीकों एक मूल्य के सेल और एक समारोह सेल है, जो अलग-अलग हैं आप उपयोग कर सकते funcall

(defun dumb-f() 
    (message "I'm a function")) 

(defvar my-function 'dumb-f) 

(funcall my-function) 
==> "I'm a function" 
संबंधित मुद्दे