elisp

2011-01-10 10 views
6

में एक डीएसएल बनाने के लिए कैसे मैं elisp में एक डीएसएल कुछ इस तरह की तलाश में बनाना चाहते हैं:elisp

(install 
;; do install 
) 

(uninstall 
;; do uninstall 
) 

हालांकि, बाद से elisp एक वैश्विक नाम स्थान है, यह एक अच्छा विचार नहीं है। और इस तरह के कार्यों को उपसर्ग करना, इतनी बदसूरत बदसूरत है।

(package-install 
;; do install 
) 

(package-uninstall 
;; do uninstall 
) 

तो मैं एक समझौता सभी आदेशों एक आदेशों में लिपटे जा सकता है के रूप में सोचा इस तरह कहते हैं:

(commands 
(install 
    ;; do install 
) 

(uninstall 
    ;; do uninstall 
) 

;; ... 
) 

लेकिन है के बाद से मैं नहीं चाहता ग्लोबल नेम स्पेस में स्थापित और स्थापना रद्द करें , मुझे किसी भी तरह से मैक्रो में आदेश देना है, उदाहरण के लिए उपसर्ग के नामों के साथ आदेशों की सभी घटनाओं को प्रतिस्थापित करें, उदाहरण के लिए:

(defmacro commands (&rest body) 
    (mapcar 
    (lambda (exp) 
    (setcar exp (intern (concat "package-" (symbol-name (car exp))))) 
    (setcdr exp (list (cons 'progn (cdr exp))))) 
    body) 
    `(progn ,@body)) 

(commands 
(install 
    ;; do install 
) 

(uninstall 
    ;; do uninstall 
) 

;; ... 
) 

ऐसा लगता है कि यह हैक। इसके अलावा यदि कोई नेस्टेड कमांड हैं तो यह काम नहीं करेगा।

क्या इसके लिए कोई अच्छा समाधान है या जाने का रास्ता हैक है?

धन्यवाद!

+0

YASnipper अपने कार्यों को 'yas /' के साथ उपसर्ग करता है, इसलिए आपको 'yas/expand' मिलता है। मैंने नहीं सोचा था कि बदसूरत था। मैंने लिखे गए टीएफएस एकीकरण के लिए सम्मेलन अपनाया, इसलिए 'tfs/checkout',' tfs/add', और इसी तरह है। यह औपचारिक समर्थन की अनुपस्थिति में, नाम स्कोपिंग करने का एक सस्ता और आसान तरीका प्रतीत होता है। – Cheeso

+0

बस एक स्टाइलिस्ट एनोटेशन: मैं 'कमांड' /' setcdr' का उपयोग नहीं करता जैसा कि आप 'कमांड' मैक्रो की परिभाषा में करते हैं। एक ताजा 'विपक्ष' बनाएं (जो कोड क्लीनर भी बनायेगा)। आप नहीं जानते, इसका क्या प्रभाव हो सकता है, यदि आपका मैक्रो विस्तारक मूल रूप से मूल कोड पेड़ को विनाशकारी तरीके से संशोधित करता है। – Dirk

उत्तर

8

स्थानीय रूप से install और दोस्तों को परिभाषित करने के बारे में कैसे? यह मानक कार्यों को छिपाएगा, लेकिन ऐसा नहीं लगता है कि आप वास्तव में क्या कर रहे हैं।

(defmacro commands (&rest body) 
    `(flet ((install (&rest args) (apply 'package-install args)) 
      (uninstall (&rest args) (apply 'package-uninstall args))) 
    ,@body)) 

बेशक आप स्वत: flet तर्कों की है कि सूची बनाने के लिए चाहते हैं। आपको कहीं भी (feature-symbols 'package) का उपयोग करके अपने पैकेज के तत्वों की एक सूची की आवश्यकता है।

+1

यह वही है जो मैं ढूंढ रहा हूं! आपका बहुत बहुत धन्यवाद! – rejeep

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