2011-09-03 12 views
7

क्या कोई जानता है कि क्लोजर में method_missing (à la रूबी) को कैसे कार्यान्वित किया जाए? ईजी।क्लोजर विधि गुम है

(defn method_missing [name & args] 
    (foo name args)) 

यह सही ढंग से उपयोग किए जाने पर डीएसएल के लिए बहुत उपयोगी होगा।

अग्रिम धन्यवाद!

+2

आप इस मामले को किस मामले में शामिल करना चाहते हैं? – Brian

उत्तर

10

रूबी में, method_missing मेटाप्रोग्रामिंग के लिए प्राथमिक संरचनाओं में से एक है। यह 'मेटाक्लास' से कक्षा में गतिशील रूप से विधियों को बनाने, रूबी की ऑब्जेक्ट उन्मुख संरचना से कसकर बाध्य है। ऐसा इसलिए किया जा सकता है क्योंकि रूबी कक्षाओं में वस्तुएं भी होती हैं।

चूंकि क्लोजर एक कार्यात्मक भाषा है, इस रूबीवाद की नकल करने से थोड़ा अर्थ नहीं आता है। हालांकि, लिस्पस (जैसे क्लोजर) के मूल मुहावरे में से एक यह है कि कोड डेटा है: और जैसे ही कोड डेटा उत्पन्न कर सकता है, यह कोड भी उत्पन्न कर सकता है। लिस्प में इस मेटाप्रोग्रामिंग करने का प्राथमिक तरीका मैक्रोज़ है।

मै मैक्रोज़ और उनके डॉस और डॉन के बारे में और अधिक पढ़ने का सुझाव दूंगा। सलाह दीजिये कि रूबी की तरह ही, गतिशील रूप से जेनरेट कोड आमतौर पर डीबग और बनाए रखने के लिए कठिन होता है। अक्सर अन्य कार्यात्मक मुहावरे का चालाक उपयोग एक बेहतर संरचनात्मक समाधान हो सकता है।

+3

मैं इनमें से अधिकांश से सहमत हूं, लेकिन मैं दावा करता हूं कि गतिशील रूप से जेनरेट कोड को डीबग या बनाए रखना मुश्किल है। मैक्रोज़ सरलीकरण और रखरखाव के लिए एक महान वरदान हैं, बशर्ते वे स्वादपूर्वक उपयोग किए जाएं। – amalloy

+0

बस यह इंगित करना चाहता था कि मैक्रोज़ का उपयोग कब किया जाना चाहिए, और जब आप सामान्य कार्यों के साथ कुछ कर सकते हैं तो इसे प्राथमिकता दी जानी चाहिए। – NielsK

+1

रुबी से खुद आने के बाद, मुझे पता चला कि फ़ंक्शन संरचना की शक्ति को समझने में कुछ समय लग सकता है। इस के आसपास काम करने के लिए मैक्रोज़ का उपयोग प्रतिकूल हो सकता है। – NielsK

5

आप एक मैक्रो बना सकते हैं जो एक कोशिश-पकड़ ब्लॉक में फ़ंक्शन कॉल को लपेट लेगा जो इस तरह के अपवाद को पकड़ लेगा।

उदा।

(with-default-method [fxn args default] ...) 

की तरह कुछ,

(try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default)) 
ऊपर

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

मैं रूबी व्यक्ति नहीं हूं, लेकिन मुझे यह महसूस हो रहा है कि यह सुविधा उस भाषा में बेक्ड है; जावा में, और विस्तार क्लोजर द्वारा, आपको इसे आजमाने और बोल्ट करना होगा, और यह सुंदर नहीं होगा।

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