में एक डीएसएल बनाने के लिए कैसे मैं 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
)
;; ...
)
ऐसा लगता है कि यह हैक। इसके अलावा यदि कोई नेस्टेड कमांड हैं तो यह काम नहीं करेगा।
क्या इसके लिए कोई अच्छा समाधान है या जाने का रास्ता हैक है?
धन्यवाद!
YASnipper अपने कार्यों को 'yas /' के साथ उपसर्ग करता है, इसलिए आपको 'yas/expand' मिलता है। मैंने नहीं सोचा था कि बदसूरत था। मैंने लिखे गए टीएफएस एकीकरण के लिए सम्मेलन अपनाया, इसलिए 'tfs/checkout',' tfs/add', और इसी तरह है। यह औपचारिक समर्थन की अनुपस्थिति में, नाम स्कोपिंग करने का एक सस्ता और आसान तरीका प्रतीत होता है। – Cheeso
बस एक स्टाइलिस्ट एनोटेशन: मैं 'कमांड' /' setcdr' का उपयोग नहीं करता जैसा कि आप 'कमांड' मैक्रो की परिभाषा में करते हैं। एक ताजा 'विपक्ष' बनाएं (जो कोड क्लीनर भी बनायेगा)। आप नहीं जानते, इसका क्या प्रभाव हो सकता है, यदि आपका मैक्रो विस्तारक मूल रूप से मूल कोड पेड़ को विनाशकारी तरीके से संशोधित करता है। – Dirk