DSLs के लिए कोई विशेष टेम्पलेट्स रहे हैं - तुम सिर्फ उपकरण भाषा में उपलब्ध लेते हैं और इसे के रूप में सुविधाजनक और संभव के रूप में डोमेन के पास बनाने के लिए प्रयास करें। लिस्प आपको अन्य भाषाओं की तुलना में अधिक टूल देता है।
अच्छा DSL के ठोस उदाहरण के लिए ClojureQL पर देखें। प्रारंभ में, एसक्यूएल डेटाबेस के संबंध में डीएसएल के रूप में बनाया गया था। और यह कंसोल से काम करने के लिए बहुत सुविधाजनक है ... लेकिन जावा या क्लोजर जैसी प्रोग्रामिंग भाषा से नहीं। जावा हाइबरनेट जैसे बड़े ORM चौखटे के साथ आया था, और Clojure सरल डीएसएल जो मूल एसक्यूएल के रूप में के रूप में सुविधाजनक है प्रदान करता है, लेकिन भाषा के हिस्से के रूप में पूरी तरह से काम करता है:
(select (table :users) (where (= :id 5)))
लिस्प DSLs में आम बात defsomething
तरह निर्माणों उपयोग कर रहा है। उदाहरण के लिए, एक पुस्तक में (क्षमा करें, मुझे इसका नाम याद नहीं है) टेक्स्ट में पैटर्न मिलान का एक उदाहरण है। लेखक एक शब्द, +
के लिए एक या अधिक शब्दों के लिए *
शून्य या अधिक शब्दों के लिए ?
जैसे कई matchhers के साथ मॉड्यूल बनाता है। इस उद्देश्य के लिए वह मैक्रो defmatcher
बनाता है जो कुछ वाक्यविन्यास लेता है और इस वाक्यविन्यास के लिए केंद्रीय रजिस्ट्री में हैंडलर जोड़ता है। यह सिर्फ अमूर्त है - कई बार दोहराए जाने वाले ऑपरेशन के बजाय वह एकल मैक्रो को बताता है कि वह वास्तव में क्या करना चाहता है - मैचर को परिभाषित करें। इसके अलावा यह उदाहरण मैक्रोज़ और उच्च ऑर्डर फ़ंक्शंस दोनों का उपयोग करता है।
तो, एक बार फिर, लिस्प-आधारित डीएसएल में कुछ खास नहीं है - आप बस अपनी भाषा में आपके पास मौजूद टूल के साथ डोमेन क्षेत्र का वर्णन करते हैं, चाहे वह जावा, क्लोजर या कुछ और हो। बस भाषा सुविधाओं के साथ उपयोग करें और आप देखेंगे कि यह कैसा दिखना चाहिए।
यूपीडी। कुछ "वास्तविक दुनिया" उदाहरण हैं, जहां लिस्प आधारित DSLs जो एक राशि अधिक सुविधाजनक हैं, OOP:
डोमेन: कार dillership
(defcar my-cool-car :wheels 4, :doors 2, :color red) ;; in Java you need Factory
(def car1 (make-car my-cool-car)) ;; and lots of methods to
;; add features to cars and
;; cars to factory
डोमेन: बिलिंग प्रणाली
(transaction ;; in Java you cannot create wrapping constructs
(withdraw account1 100) ;; so you have to use inheritance, annotations, etc.
(put account2 100)) ;; which is much more code
डोमेन: कुछ वेब सेवा, जो कई प्रकार के अनुरोधों को संभालती है
(defhandler :show-all (fn [params] ...)) ;; adds defined function to the
(defhandler :find-best (fn [params] ...)) ;; map of :message-type -> function
...
(defn handle [message]
(let [msg-type (:type message), msg-params (:params message)]
(if (contains? *handlers* msg-type)
((*handlers* msg-type) msg-params)
(throw (Exception. (concat "No handler for type" (:type message)))))))
कोई नहीं है इन उदाहरणों के बारे में विशेष बात - आप उन्हें जावा या किसी अन्य भाषा में लागू कर सकते हैं। हालांकि, कीवर्ड जैसी चीजें (पहला उदाहरण), उच्च-आदेश फ़ंक्शन (दूसरा उदाहरण), मैक्रोज़ (सभी 3 उदाहरण) आपको कोड को अधिक संक्षिप्त और वर्णनात्मक बनाते हैं।
... लेंससेट एक डीएसएल है, लेकिन वास्तव में यह वास्तव में एक "असली दुनिया" समस्या नहीं है जिसमें अधिकांश प्रोग्रामर ने कभी ऐसी प्रणाली लिखने की कोशिश नहीं की है: अच्छा ओल 'google: jpetstore एप्लिकेशन देखें .... – jayunit100