2011-02-13 8 views
5

मैं मैक्रो का उपयोग कार्यों उत्पन्न करने के लिए कोशिश कर रहा हूँ:elisp mapcar + लैम्ब्डा + मदद defmacro

(defmacro make-my-emacs-command-region (cmd name) 
    (list 'defun (intern (format "my-emacs-command-%s-%s" cmd name)) 
     '(&optional arg) 
     (list 'interactive "p") 
     (list (intern (format "mark-%s" name)) 'arg) 
     (list (intern (format "my-emacs-command-%s-region" cmd)) 
       '(region-beginning) '(region-end)))) 

जनरेटर:

(mapcar (lambda (a) (make-my-emacs-command-region a buffer)) 
     '(foo bar)) 

लेकिन मैं मिलता है:

my-emacs-command-a-buffer 

क्या मैं कर रहा हूँ गलत कर रहे हो मैं a के मान को पास करने के लिए कैसे मजबूर कर सकता हूं?

उत्तर

4

मेरे elisp थोड़ा जंग लगी है, लेकिन कोई वास्तविक विवरण के साथ ऊपर आता है जब तक: मैं अपने उदाहरण में थोड़ा और अधिक काम करने के लिए मिल सकता है उम्मीद के रूप में मेरे (eval cmd) साथ cmd मैक्रो परिभाषा शरीर में (संभवतः name के साथ एक ही) की जगह।

उम्मीद है कि इससे मदद मिलती है।

7

तुतलाना मैक्रो का एक प्रमुख मुद्दा यह है कि तर्क मूल्यांकन नहीं कर रहे हैं। macro pages in the manual पर विशेष रूप से expansion of macros पर पढ़ें। समस्या को डीबग करने में macroexpand फ़ंक्शन का उपयोग किया जाएगा। इसके अलावा, backquote आपको मैक्रो के शरीर को थोड़ी अधिक संक्षेप में लिखने में मदद कर सकता है।