2012-11-18 17 views
5

मैंने एक ही (with-current-buffer .... को बार-बार दोहराने के अपने कोड में एक प्रवृत्ति देखी है, इसलिए मैंने with-current-buffer की मैक्रो परिभाषा के आधार पर एक मैक्रो को परिभाषित करने का निर्णय लिया - यह मेरे पास अब तक है:डिफैमक्रो का शरीर निष्पादित नहीं किया जा रहा है

(defmacro with-assembla-buffer(asm-buffer-name heading-str &rest body) 
    "Create buffer with name of ASM-BUFFER-NAME, or uses it if exists,                          
    preps it with readonly/erase/heading - executes `body' - then puts                          
    readonly back on, goes to beginning of buffer, and switches to it." 
    (with-current-buffer (get-buffer-create asm-buffer-name) 
    (assembla-mode) 
    (toggle-read-only -1) 
    (erase-buffer) 
    (insert (format "-- %s --------------------" heading-str)) 
    (newline) 
    `(progn ,@body) 
    (toggle-read-only 1) 
    (goto-char (point-min)) 
    (switch-to-buffer (current-buffer)))) 

इस के शरीर निष्पादित किया जा रहा कभी नहीं है, लेकिन जब यह defun बजाय defmacro पूरी तरह से काम करता है के लिए बंद कर रहा है। तो से अलग क्यों शरीर को कभी भी निष्पादित नहीं किया गया है, मेरा दूसरा प्रश्न है - क्या यह एक डिफ्यून की तुलना में मैक्रो के रूप में अधिक समझ में आता है?

+0

के शब्दों में Emacs-23 के 'Ch च स्विच करने के लिए buffer':" चेतावनी:!। इस तरह से एक और बफर अस्थायी रूप से पर काम करने की एक लिस्प कार्यक्रम के भीतर नहीं है का उपयोग करें 'बजाय सेट buffer' कि खिलवाड़ से बचा जाता है विंडो-बफर पत्राचार के साथ " – Stefan

उत्तर

4

याद रखें, एक मैक्रो कोड उत्पन्न करता है। आपका मैक्रो ऐसा लगता है जैसे यह नहीं करता है। एक उदाहरण कॉल का एक मैक्रो विस्तार देखें। मैक्रो को डीबग करने का पहला चरण कुछ कोड के मैक्रो विस्तार की जांच करना है।

....

(with-current-buffer (get-buffer-create asm-buffer-name) 

ऊपर: क्यों इस मैक्रो में कोड के रूप में और के रूप में नहीं स्रोत कोड है? मैक्रो का विस्तार होने पर यह कोड निष्पादित किया जाएगा, यह जेनरेट कोड में दिखाई नहीं देगा। आप शायद इसे वापस करना चाहते हैं।

(assembla-mode) 
    (toggle-read-only -1) 
    (erase-buffer) 
    (insert (format "-- %s --------------------" heading-str)) 
    (newline) 

    `(progn ,@body) 

ऊपर: यह वही नहीं करेगा जो आप चाहते हैं। आपको उस कोड को बैकक्वॉट करने की आवश्यकता है जिसे आप जेनरेट करना चाहते हैं - न केवल इस फ़ॉर्म को।

+0

मैंने पूरी चीज को पीछे छोड़ दिया, और इससे अधिक समझ में आता है। धन्यवाद! –

+1

दान: यह भी ध्यान दें कि बाइट-संकलित elisp के लिए, मैक्रोज़ संकलन-समय पर विस्तारित हो जाते हैं, और इसलिए मैक्रो द्वारा निष्पादित कोड * बाइट-संकलित कोड चलाते समय * रन * पर निष्पादित नहीं किया जाएगा। (यह महत्वपूर्ण बारीकियों को याद करना आसान है, क्योंकि गैर-संकलित कोड के लिए मैक्रो गतिशील रूप से विस्तारित किया जाएगा, और कोड * हर बार निष्पादित किया जाता है।) – phils

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