2010-03-13 13 views
16

मैंने कुछ फ़ंक्शन लिखे हैं, जो लगभग समान हैं, नामों के लिए सहेजते हैं। उदाहरण के लिएसमारोह लिखने के लिए elisp मैक्रो?

; x is name, such as function/paragraph/line/etc. 
(defun my-x-function 
(interactive) 
(mark-x) (do-more-stuff) (modify-x)) 

वहाँ यह स्वचालित रूप से डाल करने के लिए समारोह, पैरा, आदि कार्यों उत्पन्न करने के लिए एक तरीका है? मुझे लगता है कि यह मैक्रोज़ करता है, लेकिन मुझे यकीन नहीं है कि उनका उपयोग कैसे करें। आप मदद/शायद छोटा सा उदाहरण महान

धन्यवाद

उत्तर

21

हां हो सकता है, कि मैक्रो वास्तव में क्या करना है।

(defmacro make-my-function (name) 
    (list 'defun (intern (format "my-%s-function" name))() 
     (list 'interactive) 
     (list (intern (format "mark-%s" name))) 
     (list 'do-more-stuff) 
     (list (intern (format "modify-%s" name))))) 

आप Emacs में एक *scratch* बफर करने के लिए इस मैक्रो को कॉपी करें और मूल्यांकन कर सकते हैं, और फिर देखें कि क्या यह इस तरह काम करता है::

(make-my-function x) ; type control-J here 
my-x-function ; <-- Emacs's output 
(symbol-function 'my-x-function) ; type control-J here 
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output 
यहाँ एक सरल मैक्रो उस पैटर्न आपके द्वारा निर्दिष्ट के अनुसार कार्य करता है बनाता है

अधिकतर मैक्रोज़ को संक्षेप में लिखने के लिए backquote सुविधा का उपयोग करेगा, लेकिन सभी मैक्रोज़ अनिवार्य रूप से उपर्युक्त उदाहरण के समान कार्य करते हैं।

+4

+1। यह मैक्रो की पठनीयता में सुधार करता है। –

3

मैक्रोज़ ऐसा कर सकते हैं, लेकिन emacs के समान काम करने के लिए बहुत सारे टेम्पलेट मॉड्यूल हैं। मैं जल्दी कोड-पीढ़ी की चीजें करने के लिए yasnippet.el नामक एक चीज़ का उपयोग करता हूं। उदाहरण के लिए, सी-स्रोत फ़ाइल में, यदि मैं for<TAB> टाइप करता हूं, तो मुझे लूप टेम्पलेट मिलता है; यह मुझे चर नाम, सीमा, और आंतरिक पाश सामग्री सेट, टेम्पलेट भरने की अनुमति देता है।

इस तरह दिखता है:

alt text http://i39.tinypic.com/o8tbmq.jpg

आप आप की तरह कुछ भी के लिए टेम्पलेट्स सेट कर सकते हैं। फंक्शन परिभाषाएं, यदि बयान, स्विच कथन, जो भी हो। विभिन्न मोड के लिए विभिन्न टेम्पलेट्स सेट अप करें। सी में for लूप के लिए टेम्पलेट सी # में for लूप के लिए टेम्पलेट से अलग है, और इसी तरह। बेहद सुविधाजनक। बैकक्वॉट सुविधा के लिए

+0

यास्निपेट बहुत अच्छा है, लेकिन शायद वही बात नहीं हो सकती है। मैक्रो संदिग्ध है, क्योंकि एमएक्स में * कीबोर्ड मैक्रोज़ * है जो टाइपिंग या * लिस्प मैक्रोज़ * को दोहराता है जो कोड पेड़ को बदलता है; yasnippet मुख्य रूप से अधिक उपयोगी है अगर उसे बॉयलरप्लेट का एक सेट दर्ज करना है जिसे समझाया नहीं जा सकता है (जो लिस्प की तुलना में सी/सी ++ के बारे में अधिक सत्य है।) – Skrylar

संबंधित मुद्दे