2013-06-02 9 views
5

क्लोजर में एक अच्छा जावा इंटरऑप प्रदान करता है नियमित रूप से मॉर्फ नियमित रूप से शुरू करने के लिए शुरुआती बिंदु। हालांकि, मैं वास्तव में इस करना चाहते हैं:मेरे डीएसएल

(servlet IndexServlet 
    (service[parmas] ....) 
    (do-post[params] ....) 
    (do-get [params] ....)) 

(servlet-filter SecurityFilter 
    (do-filter [params] ....)) 

मुझे लगता है कि क्या एक डीएसएल कहा जाता है और लिस्प दुनिया में यह मैक्रो के माध्यम से किया जाता है।

मुझे यकीन नहीं है कि कैसे/कहां से शुरू किया जाए। रेफरी और रूपों को विस्तारित करना निश्चित रूप से यहां महत्वपूर्ण भूमिका निभाता है लेकिन मुझे नहीं पता कि यह मैक्रोज़ में कैसे फिट होगा।

इस डीएसएल को कैसे शुरू करें?
एक स्निपेट, टिप्स और ट्रिक्स वास्तव में सराहना की जाती हैं।

उत्तर

3

क्लोजर में सर्वलेट कार्यान्वयन के उदाहरण के लिए आप रिंग्स जेटी एडाप्टर में देखना चाह सकते हैं। स्रोत here (1.1 रिलीज के लिए स्रोत से लिंक) उपलब्ध है। विशेष रूप से, उस नामस्थान में परिभाषित पहला फ़ंक्शन, proxy-handler जेट्टी द्वारा प्रदान किए गए एक सार वर्ग के आधार पर एक हैंडलर देता है।

यदि आप एक समान दृष्टिकोण को लागू करना चुनते हैं (जावा क्लास पर अपने सर्वलेट को कुछ तैयार किए गए विधि इंप्रेशन प्रदान करते हैं), तो आपको proxy का उपयोग करना होगा; अगर आपको केवल इंटरफेस को लागू करने की आवश्यकता है (बिना सबक्लासिंग के), तो आप शायद reify चाहेंगे। मैक्रोज़ उपयोगी होंगे या नहीं, इस पर निर्भर करता है कि कार्यान्वयन के कौन से हिस्से तय किए जाएंगे; रिंग की जेट्टी एडाप्टर मैक्रोज़ के उपयोग से लाभ नहीं उठाएगा, लेकिन आप (उदाहरण के लिए यदि आप वर्ग को एक तर्क में लागू करने के लिए कक्षा/विस्तारित करना चाहते हैं, जैसा कि सवाल इंगित करता है)।

किसी भी मामले में, जो भी कार्यक्षमता आप कार्यान्वित करने के लिए चुनते हैं उसे इंटरफेस या प्रोटोकॉल का हिस्सा बनने की आवश्यकता होगी। तो, को लागू करने javax.servlet.Servlet प्लस एक अतिरिक्त आपरेशन foo इस प्रकार दिखाई देंगे:

(import (javax.servlet Servlet ServletRequest ServletResponse)) 

(defprotocol PFoo 
    (foo [this x y z])) 

(reify 
    Servlet 
    (service [this ^ServletRequest req ^ServletResponse res] 
    ...) 
    ;; other Servlet methods here... 
    PFoo 
    (foo [this x y z] 
    ...)) 

फिर आप एक मैक्रो में इस लपेट किसी भी वांछित वाक्यात्मक चीनी उपलब्ध कराने के लिए कर सकता है। ध्यान दें कि reify वास्तव में, जिस तरह आप इंटरफ़ेस/प्रोटोकॉल के नाम और विधि परिभाषाओं बिछा अपने शरीर के अंदर के बारे में परवाह नहीं करता तो आप यह है कि अगर अधिक सुविधाजनक है अपने मैक्रो फेंकना

(reify 
    Servlet PFoo ... ; other interfaces & protocols 
    (service [...] ...) 
    (foo [...] ...) 
    ;; other methods 
) 

हो सकता था।

एक मैक्रो का एक स्केच एक सर्वलेट इंटरफ़ेस का एक नाम लेने को लागू करने (संभवतः javax.servlet.Servlet विस्तार) और कुछ अतिरिक्त तरीकों के साथ एक प्रोटोकॉल इंजेक्शन:

(defprotocol PFancyServlet 
    (do-get [this ...]) 
    (do-post [this ...])) 

(defmacro servlet [servlet-iface & meths] 
    `(reify ~servlet-iface PFancyServlet 
     [email protected])) 

methsdo-get और do-post शामिल करने की आवश्यकता होगी और साथ ही servlet-iface विधियां; यह सुनिश्चित करने के लिए कि आप यह मामला है, आप कुछ तर्क सत्यापन जोड़ सकते हैं। एक उदाहरण कॉल:

(servlet SomeServletInterface 
    (service [this ...] ...) 
    ;; ... 
    (do-get [this ...] ...) 
    (do-post [this ...] ...)) 
+0

बहुत बढ़िया! पहले पैरामीटर के रूप में 'इस' के बिना मैं कैसे कार्य कर सकता हूं? (सर्वलेट इंडेक्स सर्लेट (प्राप्त करें [अनुरोध प्रतिक्रिया]) – Chiron

+0

आपको विधि निकायों में 'इस' का उपयोग करने की आवश्यकता हो सकती है (यदि विधियां एक-दूसरे को कॉल करती हैं, तो कहें)। ऐसा कहा जा रहा है कि, आपका मैक्रो मनमाने ढंग से 'मेथ' को प्रीप्रोसेस कर सकता है, विशेष रूप से यदि आप इसे उपयोगकर्ता-स्तरीय वाक्यविन्यास में छोड़ देते हैं तो 'यह' वापस जोड़ना: '([[मेथ-नाम पैराम्स और बॉडी] मेथ] \ ' (~ मेथ-नाम ~ (वीसीसी (विपक्ष 'यह पैरा)) ~ @ शरीर))' या कुछ समान है। इससे एक विस्तार उत्पन्न होगा जिसमें 'यह' प्रत्येक विधि के शरीर में "जादू पैरामीटर" के रूप में उपलब्ध होगा। या यदि आप यही चाहते हैं तो "इस" को 'छुपाएं' 'के विस्तार में '' इस 'के स्थान पर' (gensym "this __") का उपयोग कर सकते हैं। –

+0

इसके अलावा, 'प्रॉक्सी' पहले से ही 'यह' अंतर्निहित बनाता है ('' dter प्रॉक्सी) 'देखें), 'definterface',' gen-interface 'और' gen-class 'के रूप में; 'reify',' deftype', 'defrecord', 'defprotocol' नहीं। (पुन: 'जीन-क्लास', यह 'जीन-क्लास' फॉर्म में विधि घोषणा है जो 'इस' को छोड़ देता है; कार्यान्वयन कार्यों को इसे स्पष्ट करना चाहिए।) –

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